关于docker中容器可以Ping通外网,真机无法Ping通容器的问题

  首先我们要知道整体的框架结构,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用户?

 

posted @   RainbowXu  阅读(2381)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示