Почему Docker позволяет мне запускать контейнер на 192.168.8.101:8082 и локальном хосте, но не на других IP
Здравствуйте, у меня есть следующий dockerfile на моем macOS Sierr High (как пример):
FROM richarvey/nginx-php-fpm:1.3.7
EXPOSE 80
И я могу собрать и запустить его на 192.168.8.101:8082 по
docker build -t myproject
docker run -d -p 192.168.8.101:8082:80 --name myproject myproject
и он работает на http://192.168.8.101:8082/ моем локальном компьютере и устройствах (iPhone), подключенных к той же сети Wi-Fi (у меня также нет проблем с запуском контейнера на локальном хосте).
Однако, когда я пытаюсь запустить этот контейнер на другом IP, как, например, 192.168.8.102:8082, я получаю следующую ошибку:
Mac-mini-Kamil:myproject Kamil$ docker run -d -p 192.168.8.102:8082:80 --name myproject myproject
f939d38243f420f812c859f5fe275faf49dc6e123d807583ec240fbdf0619a17
docker: Error response from daemon: driver failed programming external connectivity on endpoint myproject (0b546e63887e3ddeb4d2b21a8d6d15a94e33f1ff67c2765174a808bf6b13e120): Error starting userland proxy: listen tcp 192.168.8.102:8082: bind: cannot assign requested address.
Я пробую и другие адреса, такие как 172.17.1.2, но безуспешно, и не знаю почему. Может ли кто-нибудь дать мне совет (и / или инструкцию о том, какую дополнительную информацию я должен предоставить для решения этого вопроса)? Я хотел бы знать: почему я не могу использовать другие IP-адреса и что я могу сделать, чтобы использовать другие IP-адреса?
ОБНОВЛЕНИЕ - дополнительная информация:
После выполнения ifconfig
Я выбрал два интересных результата:
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether a8:8e:24:a3:d3:91
inet6 fe80::18fe:1146:6389:b630%en1 prefixlen 64 secured scopeid 0xa
inet 192.168.8.101 netmask 0xffffff00 broadcast 192.168.8.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=63<RXCSUM,TXCSUM,TSO4,TSO6>
ether 32:00:11:fc:70:40
Configuration:
id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
ipfilter disabled flags 0x2
member: en2 flags=3<LEARNING,DISCOVER>
ifmaxaddr 0 port 9 priority 0 path cost 0
nd6 options=201<PERFORMNUD,DAD>
media: <unknown type>
status: inactive
2 ответа
Выход из ifconfig
(Linux, OSX) или ipconfig
(Windows), вероятно, скажет вам, что ваш IP4 192.168.8.101
,
Вот почему 192.168.8.101:8082:80
работает. Докер может получить доступ к конечной точке и может сопоставить порт 80
его контейнера в порту 8082
из 192.169.8.101
,
Когда вы используете другой IP, появится эта ошибка:
Error response from daemon: driver failed programming external connectivity on endpoint
Это означает, что ваш демон Docker не может получить доступ к конечной точке 192.168.8.102
что логично, потому что это не IPV4-адрес вашей машины.
bridge0
сеть является сетью Docker по умолчанию. Если вы не укажете сеть, ваш контейнер Docker будет развернут внутри этой сети.
Ты можешь сделать: docker inspect network bridge
Вывод этой команды вернет подсеть как "Subnet": "172.17.0.0/16"
, Каждый контейнер будет иметь IP между этим частным диапазоном.
Что вы на самом деле делаете, это картирование 172.17.X.X:80
на 192.168.8.101:8082
который работает когда 192.168.8.101
доступно с вашей машины.
Я подозреваю, что ваш предыдущий контейнер все еще использует порт 8082
попробуйте использовать другой порт., я не знаю, как проверить используемый порт в Mac, но если его в Linux, вы можете проверить свой открытый порт с netstat -ntlp