Docker 主机网络驱动程序在 mac 和 linux 上有不同的行为

Docker host networking driver has different behavior on mac and linux

在MacOS上,当运行一个指定主机为网络驱动的nginx容器,然后在MACOS主机上执行curl命令我是无法访问主机端口 80 上公开的服务。 另一方面,当也使用主机作为网络驱动程序从另一个容器执行 curl 命令时,我能够访问主机端口 80 上公开的 nginx 服务:

MACHOST:~ user$ docker run -d --network host --name custom-nginx nginx
1157db8de59a5d6c1f16195bd31a395c171b3ce864cd85542b47620ba87efe05
MACHOST:~ user$ curl -s -o /dev/null -I -sw "%{http_code}\n" http://localhost:80
000
MACHOST:~ user$ docker run --rm --network host curlimages/curl curl -s -o /dev/null -I -sw "%{http_code}\n" http://localhost:80
200

我确信在 debian 主机上执行相同的命令场景时,接下来会出现预期的行为:

cloud_user@debian-instance-2:~$ docker run -d --network host --name custom-nginx nginx
905c905533f8ff8fcab45db05ec1e04545b3357e6ee463f7855da146ccee155f
cloud_user@debian-instance-2:~$ curl -s -o /dev/null -I -sw "%{http_code}\n" http://localhost:80
200
cloud_user@debian-instance-2:~$ docker run --rm --network host curlimages/curl curl -s -o /dev/null -I -sw "%{http_code}\n" http://localhost:80
200

关于正在发生的事情有什么提示吗?

Docker Mac 上的桌面在虚拟化 OS 上运行 docker 守护程序。 [参考:https://docs.docker.com/docker-for-mac/docker-toolbox/]

当执行 docker run --network host ... 时,它附加到主机上的端口,主机是虚拟机,而不是 MACHOST(物理机)。 因此,容器 custom-nginx 从基于 curlimages/curl 图像的容器中可见,因为它们都是 运行相同的虚拟主机 (VM)。 [参考:https://github.com/docker/for-mac/issues/2716]