创建一个容器(并不重要)后,我使用以下方式输入容器:
docker exec -it <container_name> /bin/bash
从容器中我可以ping google.com,以及我工作场所网络上的几乎所有服务器。 但是,出于某种原因,我无法ping通具有172.20。*。*。
的IP的服务器例如,我尝试了多台具有IP的服务器,例如10.0。*。*,10.50。*。*,一切正常。以172.20开头的服务器无法访问。 从Mac主机我可以ping所有这些服务器没有问题。 我在Linux机器和Windows机器上尝试过同样的事情,无法重现这个问题。
我假设它与Docker通过主机路由连接的方式有关。这可能与docker网络通常在172.18。*。*上的事实有关。但是,我无法理解。
这里是容器内的路由表:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.18.0.1 0.0.0.0 UG 0 0 0 eth0
172.18.0.0 * 255.255.0.0 U 0 0 0 eth0
使用Docker CE 17.09.1-ce-mac42(21090)运行macOS High Sierra。
知道发生了什么事吗?
答案 0 :(得分:0)
某处必须有路由器或防火墙阻塞。如果你想要一个好的开始,从你的mac,创建一个traceroute 172.20。。来查看它与这些服务器联系的路径。由于它是不同的网络,因此必须是路由问题。 Docker正在使用其网关172.18.0.1来处理它背后的任何内容,因此还需要检查托管它的机器的内部防火墙。上周去过那里。
答案 1 :(得分:0)
尽管出于安全考虑在某些情况下不建议使用另一种快捷方式,但将为docker容器授予与主机相同的网络权限。根据{{3}},它允许容器共享主机的网络堆栈:
docker run -it --network =“ host” / bin / bash
**同样,请特别注意这样做的安全性。
否则,您将不得不按照Michael Manuel Vandycke指出的方式解决路由问题,或者可能创建一个类似于默认docker0网桥的新网桥(就像您在主机上键入'ifconfig'一样) 。然后,您可以确保网桥具有到您要查找的子网的路由。
答案 2 :(得分:0)
我能想到的几种可能性:
最简单的方法是在启动docker之后更改主机上的网络。您需要重新启动docker,以获取wifi连接,VPN等的更改。
更常见的问题是docker网络是否与您的实际网络重叠。发生这种情况时,来自容器的请求将被路由到docker网络而不是外部网络。根据您的情况,如果到172.20.*.*
的路由通过172.18.x.x
上的网关,则您将无法达到目标。您无法直接看到的172.20.x.x
上的其他docker网络也可能引起问题。使用以下命令进行调试:
docker network inspect $(docker network ls -q) \
--format '{{.Name}}: {{if .IPAM.Config}}{{(index .IPAM.Config 0).Subnet}}{{end}}'
将其与主机(ip r
)上的路由进行比较。如果您发现到172.20.*.*
的路线有重叠,那就是您的问题。为了解决这个问题,从18.06开始,您可以告诉docker通过daemon.json文件中的以下内容从池中生成网桥网络(也可以从daemon->高级菜单在桌面中找到):
{
"bip": "10.16.100.1/24",
"default-address-pools":[
{"base":"10.17.0.0/16","size":24},
{"base":"10.20.0.0/16","size":24}
]
}
选择您否则不会遇到的子网,例如如果您使用的是笔记本电脑,请确保家庭,办公室,咖啡厅,酒店,VPN等都使用与这些网络不同的网络。对于群模式,从18.09开始创建群时,它具有类似的设置:
$ docker swarm init \
--default-addr-pool 10.20.0.0/16 \
--default-addr-pool 10.40.0.0/16 \
--default-addr-pool-mask-length 24
我在技巧提示中描述了这些命令以及其他常见问题:https://sudo-bmitch.github.io/presentations/dc2019/tips-and-tricks-of-the-captains.html#address-pools