Хобрук: Ваш путь к мастерству в программировании

Почему докер позволяет мне запускать контейнер на 192.168.8.101:8082 и локальном хосте, но не на других IP-адресах

Здравствуйте, у меня есть следующий файл докеров на моем 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

  • Какой у вас ipv4, когда вы проверяете его с помощью ipconfig или ifconfig? Ответ об ошибке от демона: драйверу не удалось запрограммировать внешнее подключение к конечной точке: = Если это не ваш IP-адрес, вы не можете подключиться к нему. 04.01.2018
  • Я полагаю, это потому, что вам нужно сначала добавить ip: 192.168.8.102 в интерфейс вашего хоста, а затем run в контейнер, как это предлагается здесь: Предоставление docker-контейнеру маршрутизируемого IP-адреса 04.01.2018
  • @tgogos - нет, я не добавляю ip - но, может быть, у меня есть какие-то «странные» настройки на моей машине - как я могу это проверить? 04.01.2018
  • @Ivthillo Я обновляю свой ответ. 04.01.2018
  • Взгляните на docs.docker.com/engine/userguide/networking/# сети по умолчанию. Обычно докер защищает от доступа из других контейнеров докеров. 04.01.2018
  • @tgogos я обновляю свой ответ - и в ifconfig я вижу свой en1: inet 192.168.8.101 - но что дальше? (Я не могу использовать команду ip addr, потому что работаю на macOs) 04.01.2018
  • @lvthillo, вы правы - секрет открыт - это работает, потому что 192.168.8.101 был IP-адресом моего компьютера в локальной сети Wi-Fi. Пожалуйста, запишите свой комментарий как ответ, и я его «проверю». 04.01.2018

Ответы:


1

Вывод ifconfig (linux, OSX) или ipconfig (Windows), вероятно, скажет вам, что ваш IP4 — 192.168.8.101.

Вот почему 192.168.8.101:8082:80 работает. Docker может получить доступ к конечной точке и может сопоставить порт 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 доступен с вашей машины.

04.01.2018

2

я подозреваю, что ваш предыдущий контейнер все еще использует порт 8082, попробуйте использовать другой порт. . я не знаю, как проверить используемый порт в Mac, но если это в Linux, вы можете проверить свой открытый порт с помощью netstat -ntlp

04.01.2018
  • У меня нет другого активного контейнера, кроме этого (это я проверяю по docker ps). При каждой попытке я убиваю контейнер с помощью docker rm -f xxxx 04.01.2018
  • вы пробовали другой порт ..?или это должен быть 8082 ? 04.01.2018
  • пробую: 192.168.8.102:8072 - все та же проблема. Но потом пробую 192.168.8.101:8072 и работает. 04.01.2018
  • правильно, так что это определенно не проблема с портом, хммм... странно. . 04.01.2018
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..