一次centos码头工人网桥模式无法访问宿主机复述,服务的故障排除经历

  


  

  

之前做了一个项目,需要在容器内访问宿主机提供的复述,服务(这是一个比较常见的应用场景哈),常规方案:

  

①主机网络(<代码>码头工人运行——网络主机代码>   

②网桥网络桥(<代码>码头工人——网络运行=>   

  

码头工人会默认建立docker0网桥;

  

网桥有一个网关ip,有一个子网段;网桥内容器从子网段中确定容器ip (ip addr eth0),网桥内容器可通过服务名称相互访问;

  

网桥内容器通过docker0之旅得以访问外网。

     

<强>不做骚操作,沿用常见的②网桥模式:
  

  

第一步:自定义网桥并应用该自定义网桥

        码头工人网络创建——网关172.16.1.1子网172.16.1.0/24 app_bridge            码头工人运行——网络=app_bridge名字……      #以下截取自docker-compose.yml文件   ……   网络:   默认值:   名称:app_bridge   外部:真正的      

为啥不利用默认docker0网桥?

  

本文开头已讲:docker0是默认网桥,新建的容器默认都会加入这个网桥,所以我们需要建立一个专属于本程序的网桥app_bridge

  

第二步:容器内建立对应于宿主机的别名

  

为实现在容器内网桥模式访问宿主机localhost: 6379年的服务,必须搭配码头工人提供的——add-host选项(对应到docker-compose.yml这个配置是extra_host)。

        码头工人的运行——add-host选项能在容器/etc/hosts文件增加行记录,便于我们使用该名称访问其他网络。      码头工人——运行——add-host dockerhost: 172.16.1.1 ubuntu猫/etc/hosts   172.17.0.22 09 d03f76bf2c   ip6-localnet fe00:: 0   ip6-mcastprefix ff00:: 0   ip6-allnodes ff02:: 1   ip6-allrouters ff02:: 2   127.0.0.1 localhost   ::1 localhost ip6-localhost ip6-loopback   172.16.1.1 dockerhost      

之后在程序的配置文件即可应用dockerhost: 6379年访问宿主机复述,服务。

  

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -稍熟悉码头工人网络模型的朋友应该都能理解并完成上述操作- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  


  

  

我在公司CentOS7机器上使用上述操作,容器内一直无法连通宿主机(容器间还是能正常访问)。

  

简化问题测试:新建容器,在容器内尝试萍docker0网关,哔了狗了,4台公司机器都ping不通docker0网关,外网还是正常访问。

  

一次centos码头工人网桥模式无法访问宿主机复述,服务的故障排除经历

  

那这个问题就成了:使用默认的docker0网桥,容器内无法ping通docker0网关,进而无法访问宿主机。

  

一次centos码头工人网桥模式无法访问宿主机复述,服务的故障排除经历

  

呀呀呀呀,八成是公司机器的配置问题~…~

  

追问公司运维同学,发现:

  

一次centos码头工人网桥模式无法访问宿主机复述,服务的故障排除经历

  

链输入(政策下降)

  

以输入链上的缺省策略是丢弃:从容器内访问宿主机的输入链规则并不匹配其中列出的任意一条,将被丢弃,所以我们从容器平docker0网关会卡住收不到结果。

  
  

除非满足列出的输入链规则,否则缺省的策略就是丢弃。

  

后面还有转发和输出链缺省是接受

     

这个策略的初衷是服务器安全(尼玛,导致容器访问宿主机的基础能力都没有了! ! !)。

  

运维方案:

  <代码>

①使用sudo service iptables停止关闭iptables

  

②把要使用的网桥网段加入输入链

  
  

sudo iptables -输入- s 172.17.0.0/16 - j接受

  

【接受docker0子网段172.17.0.0/16输入】加入规则,传送门

一次centos码头工人网桥模式无法访问宿主机复述,服务的故障排除经历