千家信息网

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

发表于:2025-02-09 作者:千家信息网编辑
千家信息网最后更新 2025年02月09日,背景:之前做了一个项目,需要在容器内访问宿主机提供的Redis 服务(这是一个比较常见的应用场景哈), 常规方案:① 主机网络(docker run --network=host): 完全应用主机网络
千家信息网最后更新 2025年02月09日一次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得以访问外网。

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

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

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网桥?

本文开头已讲: 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/hosts172.17.0.22 09d03f76bf2cfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopback172.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网关会卡住收不到结果。

除非满足列出的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通网桥网关,进而无法访问宿主机,可参考本文排障。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

容器 网桥 宿主 宿主机 网络 网关 服务 公司 内容 网段 应用 模式 就是 文件 机器 策略 规则 问题 配置 呀呀 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发发言一周的工作总结 宿迁企业软件开发业务流程 数据库操作只能输入上一年的函数 数据库原理及应用 重点 泉港网络安全宣传 上海管理软件开发工程师 海陵区个性化网络技术市场 三级网络技术考试心得 济南商中网络技术有限责任公司 驻留在web服务器上的功能 制作vpn服务器 菲律宾博彩软件开发 青少年网络安全教师护苗 如何在数据库清除缓存 电脑服务器异常无信号死机 张店销售软件开发定制 网络安全风险防控工作总结 软件开发培训的注意要点 自从连接了数据库电脑变卡 2021年网络安全周主题是 服务器上的游戏怎么玩 怎么实现数据库传输在页面上 可以打开数据库设计器的是 软件开发服务类公司名称 天津服务器电源价格怎么样 科密考勤软件连接不了数据库 芯片公司软件开发流程 女性网络安全保护义务 2020网络安全插图 神通数据库连接失效
0