共计 821 个字符,预计需要花费 3 分钟才能阅读完成。
导读 | 首先我们要知道整体的框架结构,docker 是我们安装在 centos7 上的,而 centos7 是安装在 vmware 上。其中 docker 中还有若干容器运行。 |
整体框架图如下:
我们将它分为两部分,一部分是 docker 环境,除去 docker 的所有划分到另一个部分。(我们知道 centos7 和我们的真机是同一个网段的 ip,不需要配置之间可以相互通信)。那 dokcer 本身又是一个大整体,其下面还有很多我们生成的容器,他们的 ip 是由 docker 的虚拟网卡生成的,他们是一个网段的。彼此之间应该是可以相互 ping 通的。
例如我的 docker 中 ubuntu 的 ip 为 172.17.0.2,而真机和 centos7 是 192.168 网段的。
之前我们尝试过,发现 docker 的 ubuntu 竟然也可以 ping 通外网,按道理它不是应该不通向外网的吗?后来知道,在 docker 环境中,不同的容器就像相当于不同的主机,而 docer 本身将它们互通,起到了交换机的作用,同时,docker 本身也有着路由功能,自带 dhcp 和 nat 服务。我们都知道(你知道吗)NAT 服务是将一个网段的 ip 转换为另一个网段的 ip 来进行通信。
按照最上面的框架图来说,docker 中的 ubuntu(172.16.111.1) 想要去连接外网,docker 发现它和外网的 ip 网段不同,自动转换为 172.16.3.222。这时候,和我们外面的真机环境网段匹配了,就可以正常通信了。而当我们真机环境的主机去寻找 ubuntu 容器时,发现找不到 172.16.111.1,就会出现请求超时或者目标不可达的现象。
问题找到了,那么解决办法也很简单,既然主机找不到,那我们就添加一条静态即可,当我们真机去 ping172.16.111.1 时,人为的将它转换为 192.16.3.222,这时候自然也能 ping 通了。