Подтвердить что ты не робот

Докер: MacOSX Expose Контейнерные порты на хост-машине

В моей работе я работаю с докером и опцией --net=host, работающей как шарм, перенаправляющий порты контейнера докеров на машину. Это позволяет мне добавлять задачи grunt, которые используют определенные порты, например:

  • Taks для обслуживания моего отчета о покрытии в порту 9001
  • Локальная развернутая версия моего приложения, работающая в порте 9000
  • Часы в режиме реального времени перезагружают порт 35729
  • Для бегунов для тестирования модулей используйте порт 9876

Когда я начинаю использовать Docker в Mac, первой проблемой, которая у меня была, была: Опция --net=host больше не работает. Я исследовал, и я понимаю, почему это невозможно (Docker в Mac работает на собственной виртуальной машине), и мое мгновенное решение использует параметр -p для раскрытия портов, но это ограничение для меня добавить все больше и больше задач, которые используют порты, потому что мне нужно запустить явную команду -p для каждого порта, который мне нужно открыть.

Кто-нибудь с этой же проблемой? Как справиться с этим?

4b9b3361

Ответ 1

Вероятно, ваша проблема связана с использованием dockertoolbox или dhingy/dlite или чего-то еще, обеспечивающего полноценную Linux-версию Linux, которая затем размещает докеры для запуска вашего контейнера внутри этой виртуальной машины. У этой виртуальной машины, конечно же, свой собственный сетевой стек и собственный IP-адрес на хосте, и это были ваши инструменты, которые будут иметь проблемы. Открытые порты контейнера не подвергаются воздействию OSX host localhost, а скорее OSX Docker-VM-ip.

Чтобы решить эти проблемы элегантно

Экспортировать порты в OSX localhost из контейнера

  • Сначала используйте /install docker-for-mac https://docs.docker.com/engine/installation/mac/ вместо dockertoolbox или других. Он основан на специальном стеке xhyve, который повторно использует сетевой стек ваших хостов.
  • когда вы сейчас выполняете docker run -p 3306:3306 percona, он привяжет 3306 к osx-host-localhost, поэтому каждый другой инструмент osx, пытающийся подключиться к localhost: 3306, будет работать (очень полезен) так же, как вы привыкли к нему, когда вы установили mysql с помощью brew install mysql или аналогично
  • Если у вас возникли проблемы с производительностью с использованием общих ресурсов ОС OSX с контейнерами докеров, отметьте http://docker-sync.io - он совместим с docker-for-mac (подсказка: я смещен на этом)

Экспорт портов с OSX-хоста в хранилище

В действительности вы ничего не экспортируете, вы скорее сделаете их доступными в целом из всех контейнеров (все порты OSX-host-localhost)

Если вы хотите прикрепить к порту, который вы предлагаете на хосте OSX, из контейнера, например. во время сеанса xdebug ваша среда IDE прослушивала порт 9000 на OSX-host-localhost, а контейнер с FPM/PHP должен прикрепить к этому osx-localhost: 9000 на mac, вам нужно сделать это: https://gist.github.com/EugenMayer/3019516e5a3b3a01b6eac88190327e7c

Итак, вы создаете фиктивный loopback ip, так что вы можете получить доступ к своим портам OSX-хоста из контейнеров без использования 10.254.254.254:9000 - это переносимо и в основном дает вам все, что вам нужно для разработки, как вы привыкли к


Итак, вы даете возможность подключения к портам, открытым контейнерам, для приложений, работающих на Mac, и пытающихся подключиться к localhost: порт

И второй обратный, если что-то в контейнере хочет подключиться к порту на хосте.

Ответ 2

Один способ обхода, упомянутый в "" Связывать контейнеры портов с хостом", - это использовать -P:

(или --publish-all=true|false) до docker run, который является общей функцией, которая идентифицирует каждый порт с линией EXPOSE на изображениях Dockerfile или --expose <port> флаг командной строки и отображает его на хост-порт где-то в пределах эфемерного диапазона портов.
Команда docker port должна использоваться для проверки созданного сопоставления.

Итак, если ваше приложение может использовать docker port <CONTAINER> для извлечения сопоставленного порта, вы можете добавить столько контейнеров, сколько захотите, и таким образом получить сопоставленные порты (без необходимости "явной команды -P для каждого порта" ).

Ответ 3

Не уверен, что docker для mac может поддерживать двунаправленное соединение позже https://forums.docker.com/t/will-docker-for-mac-support-bi-directional-connection-between-host-and-container-in-the-future/19871

У меня есть два решения:

  • вы можете написать простую оболочку script и передать порт, который вы хотите открыть, в script
  • используйте vagrant для запуска виртуальной машины с контролируемой сетью.