当docker run命令中提到--net = host时,Docker容器不会公开端口

are*_*vur 28 ip docker dockerfile docker-build

我在CentOS docker主机上有一个CentOS docker容器.当我使用此命令运行docker镜像时docker run -d --net=host -p 8777:8777 ceilometer:1.x,docker容器获取主机的IP,但没有为其分配端口.

如果我在没有"--net = host"的情况下运行相同的命令,则docker会docker run -d -p 8777:8777 ceilometer:1.x公开端口但使用不同的IP.docker版本是1.10.1.我希望docker容器与暴露端口的主机具有相同的IP.我也在Dockerfile指令中提到EXPOSE 8777但在docker run命令中提到"--net = host"时没有用.

dne*_*hin 22

docker版本是1.10.1.我希望docker容器与暴露端口的主机具有相同的ip.

使用--net=host它时告诉容器使用主机网络堆栈.因此,您无法端口暴露给主机,因为它主机(就网络堆栈而言).

docker inspect 可能不会显示公开端口,但如果您有一个应用程序在端口上侦听,它将像在主机上运行一样可用.

  • 那么当你执行 netstat 时这些端口不应该显示吗?为了测试这一点,我运行了: docker run -it --rm --net container:cass1 poklet/cassandra cqlsh 并且看不到“ExposePorts”,但 netstat 也没有显示任何内容 (5认同)

Sha*_*non 20

这个答案让我感到困惑。显然我的docker映像应该在端口8080上可以访问。但事实并非如此。然后我读

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

报价

主机网络驱动程序仅在Linux主机上有效,而Mac的Docker,Windows的Docker或Windows Server的Docker EE不支持该主机网络驱动程序。

当我在Mac上时,这很烦人。docker命令应该报告错误,而不是让我认为它应该工作。

讨论为何不报告错误

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

不确定我是否相信。

  • 不太相信 M$ Windows 中仍然存在这种情况(docker-compose 版本 1.24.1,docker 服务器版本 19.03.2),阅读手册并重申关键信息做得很好。 (5认同)
  • 感谢您在这里注意到这一点。确实很烦人,它不适用于 Mac (3认同)

rjd*_*olb 18

在 Linux 上,我总是在需要--net=host时使用myapp连接到另一个托管 PostgreSQL 的 docker 容器。

myappDATABASE在此示例中读取环境变量

就像Shane提到的那样,这在 MacOS 或 Windows 上不起作用......

docker run -d -p 127.0.0.1:5432:5432 postgres:latest
Run Code Online (Sandbox Code Playgroud)

所以我的应用程序无法连接到我的其他 docker 容器:

docker run -e DATABASE=127.0.0.1:5432 --net=host myapp
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以使用host.docker.internal而不是127.0.0.1解析您的主机 IP 地址。

因此,这有效

docker run -e DATABASE=host.docker.internal:5432 -d myapp
Run Code Online (Sandbox Code Playgroud)

希望这可以节省某人的时间!