当在docker run命令中提到--net=host时,Docker容器不会暴露端口。

60
我在一个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"时,它没有用处。

这里的问题是什么? - cantSleepNow
"没有分配端口": 你如何确定这一点呢? - VonC
1
您可以通过使用netstat命令或者docker port <容器名称/容器ID>命令来确定Docker正在使用哪些端口。 - arevur
5
标志 --net=host 与容器共享主机接口。 因此,如果您不启动监听任何端口的服务,则不会“发布”任何端口,因为没有必要。 如果共享主机接口,则 -p 标志无用,因为所有所需端口将直接在主机接口上“发布”。 换句话说:当使用 --net=host 时,主机和容器之间的端口空间被共享。 - Auzias
3个回答

160
我对这个答案感到困惑。显然,我的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。我不确定我是否被说服了。

13
很难相信在M$ Windows中仍然存在这个问题(docker-compose版本1.24.1,docker服务器版本19.03.2),感谢您阅读手册并重申关键信息。 - Tyeth
11
赞赏你在这里指出了这个问题。真的很烦人,因为它在Mac上无法正常工作。 - tuan.dinh

32
当前使用的 Docker 版本是 1.10.1。我希望 Docker 容器与主机 IP 相同且端口已暴露。
当你使用 --net=host 时,容器会使用主机的网络堆栈。因此,你无法将端口“暴露”给主机,因为对于网络堆栈而言,它就是主机。 docker inspect 可能不会显示暴露的端口,但如果你有一个监听端口的应用程序,则该端口将可用,就像它在主机上运行一样。

5
当你使用netstat时,这些端口不应该出现吗? 为了测试这个问题,我运行了以下命令: docker run -it --rm --net container:cass1 poklet/cassandra cqlsh 但是我没有看到“ExposedPorts”,同时netstat也没显示任何内容。 - kisna
是的,你在检查中看不到端口。但是如果它工作并且你的进程正常运行,netstat或lsof会显示端口号sudo lsof -i | grep LISTEN -> node 1799 199 12u IPv6 247434980 0t0 TCP *:3443 (LISTEN) - Björn
如果我使用docker-compose运行会怎样呢?我尝试删除端口,但是没有成功 :-( - ItayB

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

在这个例子中,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

希望这能为某些人节省时间!

1
嗨,这个可以工作。想知道是否有一种方法可以连接到Postgres容器而不使用 --net="host" - Gopesh Khandelwal
1
没问题,谢谢你。 - badsyntax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接