我有两个容器在 docker 桥接网络(可以是默认的docker0
,也可以是用户定义的桥接)上运行。如果我从一个容器发布端口,则另一个容器无法通过主机 IP 地址访问这些已发布的端口。
例子:
$ docker run --detach -p 80:80 nginx
$ docker run --rm -it centos \
/bin/bash -c "yum install -y wget && wget http://${HOST_IP}"
...
Connecting to ${HOST_IP}:80... failed: No route to host.
在上面的例子中,可以从主机和网络(或互联网)上的其他服务器访问 nginx 服务器。但是,具有完全网络访问权限的 centos docker 容器无法连接到主机上的端口 80。只要不在 docker 网桥上,就可以毫无问题地访问主机上的所有端口。
我发现完全禁用防火墙(firewalld 和 iptables)并重新启动 docker 服务可以允许访问,所以我相当确定这是一个防火墙问题。我发现这个 docker libnetwork PR,但六个月内没有任何活动。
我是不是遗漏了有关 docker 的一些基本知识?同一桥接网络上的两个容器难道不应该能够通过发布端口进行通信吗?我应该补充一点,如果我尝试从 centos 容器内部直接使用内部私有网络 IP(172.XXX)访问 nginx 端口,那么它就可以正常工作。只有连接到已发布的主机端口时才会这样。
我发现上述情况发生在最新的 centos (7.4.1708) 和 fedora (28) 映像中。