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

问题描述 投票:0回答:4

我在 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”时没有用。

docker ip dockerfile docker-build
4个回答
171
投票

我对这个答案感到困惑。显然我的 docker 镜像应该可以通过端口 8080 访问。但事实并非如此。然后我就读了

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

引用

主机网络驱动程序仅适用于 Linux 主机,Docker for Mac、Docker for Windows 或 Docker EE for Windows Server 不支持。

这很烦人,因为我使用的是 Mac。 docker 命令应该报告错误,而不是让我认为它应该起作用。

讨论为什么不报错

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

不确定我是否相信。


35
投票

docker版本是1.10.1。我希望 docker 容器与主机具有相同的 IP,并暴露端口。

当您使用

--net=host
时,它会告诉容器使用主机网络堆栈。因此,您不能将端口暴露给主机,因为它就是主机(就网络堆栈而言)。 docker inspect 可能不会显示公开端口,但如果您有一个应用程序正在侦听端口,则它将像在主机上运行一样可用。

在 Linux 上,当 

--net=host

20
投票
myapp

myapp

在此示例中读取环境变量

DATABASE


就像 
Shane
提到这在 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

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


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

0
投票

告诉我们: “Mac、Windows 和 Linux 的 Docker Desktop 版本 4.29 及更高版本也支持主机网络作为 Beta 功能。要启用此功能,请导航到“设置”中的“开发中的功能”选项卡,然后选择“启用主机网络”。”

它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.