Почему 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

Другие вопросы по тегам