Контейнер 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
Надеюсь, это сэкономит кому-то время!