尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

搞懂 Docker 容器通信

搞懂 Docker 容器通信 目录为什么容器通信是新手重灾区Docker 默认网络docker0 网桥到底是什么四种单机网络模式逐个拆解 实操 3.1 bridge默认桥接模式 3.2 host 主机模式 3.3 container 复用容器网络 3.4 none 无网络隔离模式重点坑点默认 bridge 和自定义 bridge 的 DNS 区别面试高频实操演示容器之间互相通信完整示例常见问题总结ping 不通、端口冲突等1. 为什么容器通信是新手重灾区刚开始学 Docker 的时候我一直以为容器启动就能互相访问。 直到有一次项目两个容器一个 mysql、一个 web死活连不上数据库。查了很久才发现我用了默认 docker0 网桥只能用 IP 访问不能直接用容器名字通信。很多教程只给命令不解释底层。面试经常问docker0 是什么host 模式优缺点自定义 bridge 优势在哪 这篇文章把单机容器通信讲明白全部可以自己动手敲命令验证。环境CentOS7 / UbuntuDocker 24查看 docker 自带网络命令docker network ls默认会看到三个网络bridge、host、none。2. Docker 默认网络docker0 网桥到底是什么docker0 就是 Docker 自动创建的虚拟网桥bridge可以理解成一台内置的虚拟交换机。启动容器不指定--network默认接入 docker0每启动一个容器生成一对veth pair虚拟网线一头连容器网卡一头插到 docker0 网桥上容器拿到172.17.0.x网段 IPdocker0 网关一般是172.17.0.1默认 docker0 网桥不支持容器名 DNS 解析只能 IP 通信。 也就是说容器 A ping 容器 B 名字会失败ping B 的 IP 才能通。想要容器名直接通信必须自己新建自定义 bridge 网络。3. 四种单机网络模式逐个拆解 实操3.1 bridge默认桥接模式原理独立网络命名空间容器拥有独立网卡 IP通过 docker0 网桥转发数据包。 对外访问容器需要-p端口映射。# 默认bridge启动容器 docker run -d --name c1 alpine sleep 3600优点网络隔离互不影响最常用开发模式 ❌缺点默认 docker0 不支持容器名称 DNS有一点网桥转发损耗3.2 host 主机模式--network host容器不再创建独立网络栈直接复用宿主机网卡、IP、端口没有 veth pair。docker run -d --name c2 --network host alpine sleep 3600优点性能最高没有 NAT、网桥转发损耗不需要端口映射 ❌缺点隔离性差极易端口冲突宿主机端口被占用容器就无法使用对应端口。面试常问host 模式为什么不用 - p 做端口映射3.3 container 复用容器网络--network container:容器名/ID新容器不创建自己网卡 IP直接复用另一个已经存在容器的网络栈。两个容器 IP 完全一样。# 复用c1的网络栈 docker run -d --name c3 --network container:c1 alpine sleep 3600适用场景日志采集、sidecar 附属容器和主容器共享网络。 ❌缺点高度耦合主容器删除这个容器网络直接失效。3.4 none 无网络隔离模式--network none容器只有本地回环网卡 lo没有任何外部网卡完全断网。docker run -d --name c4 --network none alpine sleep 3600适合场景纯本地计算、安全隔离完全不需要联网的任务。 ❌缺点容器不能和宿主机、其他容器通信。4.重点坑点默认 bridge 和自定义 bridge 的 DNS 区别这是很多人踩的最大坑。docker0 默认 bridge容器之间只能 IP 互通不支持容器名 DNS 解析ping 容器名字失败。用户自定义 bridgeDocker 自带 DNS 服务可以直接用容器名称互相通信创建自定义网桥命令# 创建自定义桥接网络 my-net docker network create my-net5. 实操演示容器之间互相通信完整示例目标两个容器加入自定义 my-net用容器名字互相 ping 通。# 1. 创建自定义网络 docker network create my-net # 2. 启动两个容器接入my-net docker run -d --name web --network my-net alpine sleep 3600 docker run -d --name db --network my-net alpine sleep 3600 # 3. 进入web容器ping db容器名字 docker exec -it web ping db✅结果可以直接 ping 通自定义网桥自动 DNS 解析容器名称。对比如果两个容器都在默认 docker0ping db直接失败只能 ping IP。查看网络详情docker network inspect my-net6. 常见问题总结ping 不通、端口冲突等问题 1同 docker0 下容器 ping 不通检查防火墙、selinux确认容器 IP 是否在同一个子网。记住默认 bridge 不能用容器名字访问。问题 2host 模式启动容器端口占用报错原因host 模式共享宿主机端口宿主机已经占用的端口容器不能再使用。问题 3外部电脑访问容器访问不到bridge 模式必须加-p 宿主机端口:容器内端口做端口映射。host 模式不需要 - p。问题 4不同自定义网桥里的容器默认不能互通不同网络是隔离的想要互通把容器加到同一个网络。
返回列表