Docker: порты MacOSX Expose Container для хоста

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

Такс для обслуживания моего отчета о покрытии в порту 9001Локально развернутая версия моего приложения обслуживается в порту 9000Смотреть в прямом эфире перезагрузить порт 35729Для модульного тестирования бегуна используйте порт 9876

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

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

Ответы на вопрос(3)

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

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

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

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

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

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

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

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

Выставить порты в OSXlocalhost из контейнераВо-первых, используйте / установите Docker-для-Machttps://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-для-Mac (подсказка: я предвзято на этот)Экспортируйте порты с OSX-хоста в контейнер

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

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

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

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

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

Ваш ответ на вопрос