Контейнер Docker не предоставляет порты, когда --net=host упоминается в команде запуска docker

У меня есть док-контейнер CentOS на узле докера CentOS. Когда я использую эту команду для запуска образа докера docker run -d --net=host -p 8777:8777 ceilometer:1.x, контейнер докера получает IP-адрес хоста, но ему не назначены порты.

Если я запускаю ту же команду без "--net=host" docker run -d -p 8777:8777 ceilometer:1.x, docker предоставляет порты, но с другим IP-адресом. Версия докера 1.10.1. Я хочу, чтобы контейнер докеров имел тот же IP-адрес, что и хост с открытыми портами. Я также упомянул в Dockerfile инструкцию EXPOSE 8777, но бесполезно, когда "--net=host" упоминается в команде docker run.


person arevur    schedule 23.02.2016    source источник
comment
В чем тут вопрос?   -  person cantSleepNow    schedule 23.02.2016
comment
ему не назначены порты: как вы это определяете?   -  person VonC    schedule 23.02.2016
comment
Вы определяете, какие порты использует докер, с помощью netstat или можете использовать порт докера ‹имя контейнера/идентификатор контейнера›   -  person arevur    schedule 24.02.2016
comment
Флаг --net=host разделяет интерфейс хоста с контейнером. Следовательно, если вы не запустите службу, которая прослушивает какой-либо порт, порт не будет опубликован, так как в этом нет необходимости. Флаг -p бесполезен, если интерфейс хоста является общим, потому что все необходимые порты будут напрямую опубликованы на интерфейсе хоста. Другими словами: пространство портов между хостом и контейнерами совместно используется при использовании --net=host.   -  person Auzias    schedule 24.02.2016


Ответы (2)


Версия докера 1.10.1. Я хочу, чтобы у контейнера докеров был тот же IP-адрес, что и у хоста с открытыми портами.

Когда вы используете --net=host, он указывает контейнеру использовать сетевой стек хоста. Таким образом, вы не можете открывать порты хосту, потому что он является хостом (с точки зрения сетевого стека).

docker inspect может не отображать открытые порты, но если у вас есть приложение, прослушивающее порт, оно будет доступно, как если бы оно работало на хосте.

person dnephin    schedule 17.09.2016
comment
Разве эти порты не должны отображаться, когда вы выполняете netstat? Чтобы проверить это, я запустил: docker run -it --rm --net container:cass1 poklet/cassandra cqlsh И не вижу ExposedPorts, но netstat тоже ничего не показывает - person kisna; 23.11.2016
comment
Да и да. Вы не видите порт в inspect. Но если это работает и ваш процесс работает netstat или lsof показать порт sudo lsof -i | grep LISTEN -> node 1799 199 12u IPv6 247434980 0t0 TCP *:3443 (LISTEN) - person Björn; 07.02.2017
comment
а что если я запущу с docker-compose? Я попытался удалить порты без недостатка :-( - person ItayB; 10.02.2017

Меня смутил этот ответ. Очевидно, мой образ докера должен быть доступен через порт 8080. Но это не так. Потом я прочитал

https://docs.docker.com/network/host/

Цитировать

Сетевой драйвер хоста работает только на хостах Linux и не поддерживается в Docker для Mac, Docker для Windows или Docker EE для Windows Server.

Это довольно раздражает, так как я на Mac. Команда docker должна сообщать об ошибке, а не позволять мне думать, что она должна работать.

Обсуждение почему не сообщает об ошибке

https://github.com/docker/for-mac/issues/2716

Не уверен, что я убежден.

person Shane Gannon    schedule 28.09.2018
comment
Не могу поверить, что это все еще имеет место в M $ Windows (версия docker-compose 1.24.1, версия docker server 19.03.2), молодцы, что прочитали руководство и повторили важную информацию. - person Tyeth; 25.09.2019
comment
Спасибо, что отметили это здесь. Это действительно раздражает, что это не работает для Mac - person tuan.dinh; 16.08.2020