无法在Docker容器

时间:2017-12-21 10:03:04

标签: macos docker

创建一个容器(并不重要)后,我使用以下方式输入容器:

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。

知道发生了什么事吗?

3 个答案:

答案 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'一样) 。然后,您可以确保网桥具有到您要查找的子网的路由。

docker documentation on network settings

答案 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