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

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

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

3 ответа

Решение

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

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

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

Я был смущен этим ответом. Очевидно, мой образ докера должен быть доступен на порту 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

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

я всегда использовал --net=hostкогда нужно подключиться к другому контейнеру докеров, на котором размещен PostgreSQL, который также работает на моей машине в Linux.

myappчитает переменную окружения DATABASEв этом примере

Как упоминает Шейн , это не работает на MacOS или Windows...

      docker run -d -p 127.0.0.1:5432:5432 postgres:latest

Поэтому мое приложение не может подключиться к другому моему другому контейнеру докеров:

      docker run -e DATABASE=127.0.0.1:5432 --net=host myapp

Чтобы обойти это, вы можете использовать host.docker.internalвместо 127.0.0.1для разрешения IP-адреса вашего хоста.

Поэтому это работает

      docker run -e DATABASE=host.docker.internal:5432 -d myapp

Надеюсь, это сэкономит кому-то время!

Другие вопросы по тегам