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

Docker container doesn't expose ports when --net=host is mentioned in the docker run command

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

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

The docker version is 1.10.1. I want the docker container to have same ip as the host with ports exposed.

当您使用 --net=host 时,它会告诉容器使用主机网络堆栈。所以你不能向主机​​公开端口,因为它主机(就网络堆栈而言)。

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

我被这个答案弄糊涂了。显然我的 docker 图像应该可以在端口 8080 上访问。但事实并非如此。然后我读

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

引用

The host networking driver only works on Linux hosts, and is not supported on Docker for Mac, Docker for Windows, or Docker EE for Windows Server.

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

讨论为什么不报错

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

不确定我是否相信。

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

myapp读取一个环境变量DATABASE在这个例子中

喜欢 提到这在 MacOS 上不起作用或 Windows...

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

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

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

希望这可以节省一些时间!