- A+
首先我们要知道整体的框架结构,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通了。
上一篇我们的解决办法是在创建容器的一开始就配置端口映射,使得我们能够通过ssh连接到ubuntu,但也是不能直接ping通ubuntu的。但对我们后序使用无关紧要。在实验过程中我查到很多人说可以再配置防火墙来实现,但是我出现了报错的现象,未能解决,希望评论区大佬指正。
安装完iptables后想要查看占用,报错说我不是root用户,但是看前面的提示符可以看到我就是root用户登录的。
以及我之前安装完防火墙,进行任何操作都会有类似的报错,说我不是root用户?