小知识:一次centos Docker网桥模式无法访问宿主机Redis服务的故障排除经历

背景:

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

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

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

docker会默认建立docker0 网桥

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

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

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

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

?
1
docker network create –gateway 172.16.1.1 –subnet 172.16.1.0/24 app_bridge
?
1
2
3
4
5
6
7
8
docker run –network=app_bridge –name ……
# 以下截取自docker-compose.yml文件
……
networks:
default:
name: app_bridge
external: true

为啥不利用默认docker0网桥?

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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网关,外网还是正常访问。

%小知识:一次centos Docker网桥模式无法访问宿主机Redis服务的故障排除经历-猿站网-插图

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

%小知识:一次centos Docker网桥模式无法访问宿主机Redis服务的故障排除经历-1猿站网-插图

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

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

%小知识:一次centos Docker网桥模式无法访问宿主机Redis服务的故障排除经历-2猿站网-插图

chain input (policy drop)

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

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

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

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

运维方案:

① 使用 sudo service iptables stop 关闭iptables

② 把要使用的网桥网段加入 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

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:docker中容器的网络配置常用命令详解

2023-4-1 17:13:19

建站知识

小知识:VMware Workstation Pro 无法在Windows上运行的解决方法

2023-4-1 17:27:50

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索