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
希望这可以节省一些时间!
我在 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
在这个例子中
喜欢
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
希望这可以节省一些时间!