[故障排除]CentOS Docker网桥模式没法访问宿主机Redis服务

背景:

  以前作了一个项目,须要在容器内访问宿主机提供的Redis 服务(这是一个比较常见的应用场景哈), 常规方案:html

①   主机网络(docker run --network=host): 彻底应用主机网络堆栈,在容器内localhost就是指向宿主机node

②   网桥网络(docker run --network=bridge):  这也是docker容器默认的网络通讯模式,容器内localhost 指向的是容器自身,不能使用 localhost 访问宿主机上localhost:6379承载的Redis服务 。docker

docker会默认创建docker0 网桥;ubuntu

网桥有一个网关ip, 有一个子网段; 网桥内容器从子网段中肯定容器ip( ip  addr eth0), 网桥内容器可经过 service name相互访问;安全

网桥内容器经过 docker0 Getway得以访问外网。 服务器

头脑风暴

不作骚操做,沿用常见的②网桥模式, 网桥网络模型以下所示:网络

Docker 引擎在网桥上有个网关IP,容器在链接的网桥上有个容器IP。app

操做

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

docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_bridge
docker run --network=app_bridge --name ......

# 如下截取自docker-compose.yml文件

...... networks: default: name: app_bridge external:
true

 为啥不利用默认docker0网桥?ide

本文开头已讲: docker0 是默认网桥,新建的容器默认都会加入这个网桥,因此咱们须要创建一个专属于本程序的网桥app_bridge

 

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

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

docker run 的--add-host 选项能在 容器 /etc/hosts 文件增长行记录,便于咱们使用该名称访问其余网络。

docker run -it --add-host dockerhost:172.16.1.1 ubuntu cat /etc/hosts
172.17.0.22     09d03f76bf2c
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
127.0.0.1       localhost
::1	        localhost ip6-localhost ip6-loopback
172.16.1.1 dockerhost

以后在程序的配置文件便可应用 dockerhost:6379 访问宿主机Redis服务。

------------------------------------------ 稍熟悉docker网络模型的朋友应该 都能理解并完成上述操做-----------------------------------------------------

情况

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

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

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

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

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

 Chain INPUT (policy DROP)

 以上INPUT链的缺省策略是丢弃:从容器内访问宿主机的INPUT链规则不匹配其中列出的任意一条,将被丢弃(缺省),因此咱们从容器ping docker0网关会收不到结果。

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

运维方案:

 ①  使用 sudo service iptables stop 关闭iptables

 ②  将容器使用的源IP(网桥网段)加入INPUT链

sudo  iptables -I INPUT -s 172.17.0.0/16 -j ACCEPT 

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

OK, That‘s All, 之后如有朋友在公司网络遇到 默认网桥容器内没法ping通网桥网关,进而没法访问宿主机,可参考本文排障。

原文出处:https://www.cnblogs.com/JulianHuang/p/11636825.html

相关文章
相关标签/搜索