在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
背景: 之前做了一个项目,需要在容器内访问宿主机提供的Redis 服务(这是一个比较常见的应用场景哈), 常规方案: ① 主机网络( ② 网桥网络(
不做骚操作,沿用常见的②网桥模式: 第一步:自定义网桥并应用该自定义网桥 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/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网关会卡住收不到结果。
这个策略的初衷是 服务器安全(尼玛, 导致容器访问宿主机的基础能力都没有了!!!)。 运维方案: ① 使用 ② 把要使用的网桥网段加入 INPUT链
OK, That‘s All, 以后若有朋友在公司网络遇到 默认网桥容器内无法ping通网桥网关,进而无法访问宿主机,可参考本文排障。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对极客世界的支持。 |
请发表评论