#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. Правильно, контейнер не будет иметь прямого доступа к сети хоста