Докер Mac-составьте nginx, предоставьте порт для прослушивания

#macos #docker #nginx #docker-compose

Вопрос:

На главной/родительской ОС запущено несколько веб-серверов (узлов), один из которых находится на порту 3000 . В докере, настроенном nginx:alpine для доступа к упомянутым серверам (запущенным в основной/родительской ОС) через один ПОРТ ( 8008 ), и для решения вопроса о том, к какому именно серверу направлять, на основе контекста URI.

Он отлично работает в Linux (Ubuntu, Centos), но я не могу заставить его работать на macOS (Big Sur 11.4).

Проблема , с которой я столкнулся на Mac, — nginx:alpine не отображается на порту 8008 , поэтому пользовательский интерфейс недоступен на http://localhost:8008/ui/

В случае явного добавления ports в hub-nginx конфигурацию главная/родительская ОС будет прослушивать порт 8008 , но контейнер все равно не будет иметь доступа к сети главной/родительской ОС , поэтому не сможет перенаправлять запросы на нее.

Конфигурация выглядит следующим образом:

докер-compose.yaml

 services:
    hub-nginx:  # Running on port 8008.
        restart: always
        image: nginx:alpine
        network_mode: "host"
        volumes:
            - ./path/nginx.conf:/etc/nginx/conf.d/default.conf:ro,Z
            - ./path/hub-service.include:/etc/nginx/include.d/hub-service.include:Z
            - ./path/hub-headers.include:/etc/nginx/include.d/hub-headers.include:Z
            - ./path/security-headers.include:/etc/nginx/include.d/security-headers.include:Z
            - ./path/certs/:/etc/nginx/certs/:Z

    ...
 

nginx.conf

 server {
    listen       8008 default_server;
    listen       [::]:8008 default_server;
    server_name  _;

    include /etc/nginx/include.d/security-headers.include;

    location /hub/ui { rewrite /hub/ui / permanent; }
    location /hub/ui/ { rewrite /hub/ui/ / permanent; }
    location /ui { rewrite /ui / permanent; }
    location /ui/ { rewrite /ui/ / permanent; }
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Original-URI $request_uri;

        include /etc/nginx/include.d/hub-service.include;
        include /etc/nginx/include.d/security-headers.include;
    }
}
 

Первоначальная настройка полностью одинакова в Linux (Ubuntu/Centos) и macOS (Big Sur 11.4), результаты перечислены ниже.

Ubuntu

inside the container, there is listening on port 8008

 $ docker --version
Docker version 20.10.7, build f0df350

$ docker container ls -a
CONTAINER ID   IMAGE                           COMMAND                  CREATED        STATUS         PORTS                                                                                                                                                                                                                                NAMES
c88c90e4179f   nginx:alpine                    "/docker-entrypoint.…"   10 hours ago   Up 4 minutes

$ docker exec -it c88c90e4179f sh

/ # netstat -an|grep 8008
tcp        0      0 0.0.0.0:8008            0.0.0.0:*               LISTEN
tcp        0      0 :::8008                 :::*                    LISTEN

/ # ifconfig |grep -B1 inet
br-f5617eed7da7 Link encap:Ethernet  HWaddr 02:42:EE:22:6E:22  
          inet addr:172.22.0.1  Bcast:172.22.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:eeff:fe22:6e22/64 Scope:Link
--
docker0   Link encap:Ethernet  HWaddr 02:42:AC:78:C1:2F  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
--
enp0s5    Link encap:Ethernet  HWaddr 00:1C:42:A6:61:CB  
          inet addr:10.211.55.4  Bcast:10.211.55.255  Mask:255.255.255.0
          inet6 addr: fe80::67ca:e0b9:cc18:be36/64 Scope:Link
          inet6 addr: fdb2:2c26:f4e4:0:533f:4916:8389:dae3/64 Scope:Global
          inet6 addr: fdb2:2c26:f4e4:0:32d:c7be:3528:1f7/64 Scope:Global
--
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
--
veth059051c Link encap:Ethernet  HWaddr 52:54:DC:FA:CE:47  
          inet6 addr: fe80::5054:dcff:fefa:ce47/64 Scope:Link
--
veth0bd2e8f Link encap:Ethernet  HWaddr 8E:1E:85:64:8C:C5  
          inet6 addr: fe80::8c1e:85ff:fe64:8cc5/64 Scope:Link
--
veth0da5d00 Link encap:Ethernet  HWaddr 72:17:82:E8:48:59  
          inet6 addr: fe80::7017:82ff:fee8:4859/64 Scope:Link
--
veth62aea5c Link encap:Ethernet  HWaddr 46:77:4D:9F:6C:D5  
          inet6 addr: fe80::4477:4dff:fe9f:6cd5/64 Scope:Link
--
veth6b1a84d Link encap:Ethernet  HWaddr 0A:2D:B0:84:6E:8A  
          inet6 addr: fe80::82d:b0ff:fe84:6e8a/64 Scope:Link
--
veth857494a Link encap:Ethernet  HWaddr DE:4E:41:75:A9:61  
          inet6 addr: fe80::dc4e:41ff:fe75:a961/64 Scope:Link
--
veth8b29086 Link encap:Ethernet  HWaddr 5A:A2:82:E2:80:C5  
          inet6 addr: fe80::58a2:82ff:fee2:80c5/64 Scope:Link
--
vetha03f417 Link encap:Ethernet  HWaddr AE:C0:85:6D:06:47  
          inet6 addr: fe80::acc0:85ff:fe6d:647/64 Scope:Link
--
vetha3bf656 Link encap:Ethernet  HWaddr 12:A2:10:32:A1:1B  
          inet6 addr: fe80::10a2:10ff:fe32:a11b/64 Scope:Link
--
vethcb6c40c Link encap:Ethernet  HWaddr AE:8E:96:6D:B3:CA  
          inet6 addr: fe80::ac8e:96ff:fe6d:b3ca/64 Scope:Link
--
vethd42d781 Link encap:Ethernet  HWaddr AE:44:D6:04:1D:76  
          inet6 addr: fe80::ac44:d6ff:fe04:1d76/64 Scope:Link
--
vethf044476 Link encap:Ethernet  HWaddr F6:51:EE:63:79:5A  
          inet6 addr: fe80::f451:eeff:fe63:795a/64 Scope:Link

 

in master/parent OS (Ubuntu) there is listening on port 8008, so it somehow was exposed:

 $ sudo netstat -peanut|grep 8008
tcp        0      0 0.0.0.0:8008            0.0.0.0:*               LISTEN      0          40774      2671/nginx: master
tcp6       0      0 :::8008                 :::*                    LISTEN      0          40775      2671/nginx: master
 

Mac

inside the container, there is listening on port 8008

 $ docker --version
Docker version 20.10.7, build f0df350

$ docker container ls -a
CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                         PORTS                                                                                                                                                                                                                                NAMES
832ad5edc45d   nginx:alpine                    "/docker-entrypoint.…"   57 seconds ago   Up 51 seconds       

$ docker exec -it 832ad5edc45d sh
/ # netstat -an|grep 8008
tcp        0      0 0.0.0.0:8008            0.0.0.0:*               LISTEN
tcp        0      0 :::8008                 :::*                    LISTEN         

/ # ifconfig |grep -B1 inet
br-cc0c1fe7d0b9 Link encap:Ethernet  HWaddr 02:42:7A:17:14:6A  
          inet addr:192.168.208.1  Bcast:192.168.223.255  Mask:255.255.240.0
          inet6 addr: fe80::42:7aff:fe17:146a/64 Scope:Link
--
docker0   Link encap:Ethernet  HWaddr 02:42:25:EB:31:21  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:25ff:feeb:3121/64 Scope:Link
--
eth0      Link encap:Ethernet  HWaddr 02:50:00:00:00:01  
          inet addr:192.168.65.3  Bcast:192.168.65.255  Mask:255.255.255.0
          inet6 addr: fe80::50:ff:fe00:1/64 Scope:Link
--
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
--
services1 Link encap:Ethernet  HWaddr BE:D7:FC:59:F5:47  
          inet addr:192.168.65.4  Bcast:0.0.0.0  Mask:255.255.255.255
          inet6 addr: fe80::bcd7:fcff:fe59:f547/64 Scope:Link
--
veth0ad34a6 Link encap:Ethernet  HWaddr 52:EB:9D:AD:20:06  
          inet6 addr: fe80::50eb:9dff:fead:2006/64 Scope:Link
--
veth1c1a7bf Link encap:Ethernet  HWaddr 06:1B:5C:73:90:35  
          inet6 addr: fe80::41b:5cff:fe73:9035/64 Scope:Link
--
veth1f0a9bc Link encap:Ethernet  HWaddr B2:07:36:06:FA:FA  
          inet6 addr: fe80::b007:36ff:fe06:fafa/64 Scope:Link
--
veth354512b Link encap:Ethernet  HWaddr 42:7C:B3:A4:16:A7  
          inet6 addr: fe80::407c:b3ff:fea4:16a7/64 Scope:Link
--
veth4dddbcd Link encap:Ethernet  HWaddr 4A:B3:16:33:42:E5  
          inet6 addr: fe80::48b3:16ff:fe33:42e5/64 Scope:Link
--
veth70bf2be Link encap:Ethernet  HWaddr 0A:8C:64:EC:4B:12  
          inet6 addr: fe80::88c:64ff:feec:4b12/64 Scope:Link
--
veth75e1fdb Link encap:Ethernet  HWaddr D2:A3:48:67:E3:B3  
          inet6 addr: fe80::d0a3:48ff:fe67:e3b3/64 Scope:Link
--
vetha1949f4 Link encap:Ethernet  HWaddr 3A:FA:4C:8F:3B:2F  
          inet6 addr: fe80::38fa:4cff:fe8f:3b2f/64 Scope:Link
--
vetha2aaf62 Link encap:Ethernet  HWaddr 3E:58:5A:1B:C3:12  
          inet6 addr: fe80::3c58:5aff:fe1b:c312/64 Scope:Link
--
vethb1acd80 Link encap:Ethernet  HWaddr 1E:5F:22:2D:A3:BE  
          inet6 addr: fe80::1c5f:22ff:fe2d:a3be/64 Scope:Link
--
vethb7d9b22 Link encap:Ethernet  HWaddr 7A:28:89:69:D9:0B  
          inet6 addr: fe80::7828:89ff:fe69:d90b/64 Scope:Link
--
vethc5957d2 Link encap:Ethernet  HWaddr 76:57:CE:C4:89:5D  
          inet6 addr: fe80::7457:ceff:fec4:895d/64 Scope:Link                                                                                                                                                                                                                                  
 

Но в основной/родительской ОС (Mac) ничего не прослушивается на порту 8008:

 $ netstat -an|grep 8008

$ lsof -i :8008

 

Может быть, настроить подсеть для контейнера с nginx тем же, что и для Resources Network , или использовать как-то host.docker.internal внутри nginx.conf ?

https://i.stack.imgur.com/DKLLS.png

Может быть, подходы (конфигурации) можно как-то изменить, чтобы иметь возможность перенаправлять с nginx основной/родительской ОС (macOS)?

Я буду очень благодарен за любую помощь в решении этого вопроса.

Комментарии:

1. @порт абхишек пхукет не имеет отношения к network_mode: "host"

2. Я попытался network_mode: "bridge" network_mode: "none" и просто удалил network_mode , но безуспешно. Не могли бы вы дать какое-либо представление о том, что еще нужно попробовать, чтобы добиться аналогичного поведения на Mac?

Ответ №1:

В соответствии со статьей об использовании сети хостов в официальной документации:

Сетевой драйвер хоста работает только на хостах Linux и не поддерживается на Docker Desktop для Mac, Docker Desktop для Windows или Docker EE для Windows Server.

Комментарии:

1. Вы хотите сказать, что невозможно добиться аналогичного поведения на Mac/Windows? Я прочитал эту официальную документацию и пришел сюда, чтобы попросить помощи, может быть обходным путем для достижения аналогичного поведения на Mac?

2. если под подобным поведением вы подразумеваете использование сетевого драйвера хоста — тогда нет, я не думаю, что в данный момент есть способ обойти это, но если вы хотите просто предоставить доступ к порту — удалите network_mode и добавьте ports инструкцию.

3. Но в этом случае контейнер все равно не будет иметь доступа к сети основной/родительской ОС, поэтому поведение, аналогичное тому, что в Linux, достигнуто не будет.

4. Правильно, контейнер не будет иметь прямого доступа к сети хоста