Я'м немного новичок в Докер. Я не мог'т найти четкое описание того, что этот параметр в командной запустить докер в глубокий и немного смущен об этом.
Мы можем использовать его для доступа к приложениям, работающим на докер контейнеров без указания порта? Как пример, если я запустить веб-приложение развертывается через изображения докер в порту 8080 с помощью опции -п 8080:8080
в командной запустить докер, я знаю, мне придется открыть порт 8080 на контейнеры Docker ИС /theWebAppName. Но я действительно не могу придумать способ, как опцию--работы нет=хост.
После установки докер у вас есть 3 Сети по умолчанию:
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
Я'м пытаюсь держать это простым. Так что если вы начинаете контейнер по умолчанию она будет создана внутри моста (docker0) сети.
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
В файла Docker Дженкинса порты 8080
и 50000
подвергаются. Эти порты открыты для контейнера на его сетевого моста. Так что все внутри, что сетевой мост могут открыть контейнер на порте 8080
и 50000
. Все в мост сети в частном диапазоне в "подсети-то": "и 172.17.0.0/16" и, если вы хотите получить к ним доступ извне, необходимо сопоставить порты с-п 8080:8080
. Это карта порт контейнера в порт вашего сервера (узла сети). Поэтому доступ к серверу на 8080
будет маршрут до bridgenetwork на порт 8080`.
Теперь у вас тоже есть свой хост сети. Не контейнеризация сетевой контейнеров. Так что если вы начинаете контейнера в узле сети это будет выглядеть так (он'с первого):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
Разница с портами. Ваш контейнер сейчас находится внутри узла сети. Так что если вы открыть порт 8080 на ваш хост вы моментально доступом контейнера.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
Я'вэ открыл порт 8080в брандмауэре, и когда я'm сейчас входя в мой сервер на порт 8080
я'м доступ к Дженкинс. Я думаю, что этот блог это также полезно, чтобы лучше ее понимать.
Опцию--чистая=хост используется для программ внутри контейнера Docker посмотреть, как они работают на самом хосте, с точки зрения сети. Это позволяет открыть большую емкость сети, чем это могут нормально сделать.
Как правило, вы должны направить порты из хоста в контейнер, но когда контейнеры используют хост'ов сети, любой сетевой активности происходит непосредственно на хост-машине - так, как если бы программа была запущена локально, а не внутрь контейнера.
А это означает, что вам больше не придется выставлять порты и сопоставить их с контейнерных портов, это означает, что вы должны изменить ваш Dockerfiles, чтобы настроить порты на каждом контейнере прослушивает, чтобы избежать конфликтов, как вы можете'т иметь две емкости, работающих на той же хост-порт. Однако, реальная причина этой опции для запуска приложений, которым требуется доступ к сети, трудно вперед к контейнеру на уровне порта.
Например, если вы хотите запустить сервер DHCP, то нужно уметь слушать широковещательный трафик в сети, и извлечь MAC-адрес из пакета. Эта информация теряется в процессе переадресации портов, поэтому единственный способ запустить DHCP-сервер внутри Докер запустить контейнер `--чистая=хост.
Вообще говоря, `--чистая=хост нужен только при запуске программы с очень специфическими, необычными потребности сети.
Наконец, с точки зрения безопасности, контейнеры Docker могут слушать на много портов, даже если они только рекламируют (разоблачить) один порт. Обычно это штраф, как вы только вперед в одном ожидаемый порт, однако если вы используйте опции--host=нет`, то вы'll получить все контейнер's портов прослушивания на хозяина, даже тех, кто'т перечислены в файла Docker. Это означает, что вы должны внимательно проверить контейнер (особенно, если это's не ваша, например, официально предоставленные программного проекта), чтобы убедиться, что вы Дон'т непреднамеренного дополнительные услуги на автомате.