大家好,我是站长。平时在后台收到不少朋友的私信,问得最多的就是:“我起了两个容器,一个数据库一个后端,怎么连不上?IP 怎么老是变?到底怎么配置才能让它们俩稳定通信?”
今天这篇文章,咱们就把 Docker 容器互通 这件事彻底聊明白。不整那些虚头巴脑的理论,直接上实操命令和配置,保证你看完能自己动手解决。
一、先搞懂 Docker 网络的底层逻辑
💡 推荐阅读:Linux服务器安全设置,这几招从入门到进阶,让你的服务器像铁桶一样稳
很多朋友习惯把容器当成一台台独立的小虚拟机,然后去查容器的 IP 地址去连接。这个思路不能说错,但在 Docker 的世界里,IP 是动态的。你重启一次容器,IP 可能就变了,你要是写死在代码里,那可就天天等着报错吧。
Docker 提供了几种内置的网络驱动,咱们日常用得最多的就是 Bridge(桥接) 和 Host(主机) 模式。默认情况下,Docker 会创建一个名为 bridge 的虚拟网桥,你启动容器如果不指定网络,它就会挂在这个网桥上,通过 NAT 方式访问外网。
在这种默认模式下,两个容器确实可以通过 IP 互通,但前提是你得先查到对方的 IP。这在生产环境里显然不靠谱。所以,我们需要更优雅的解决方案。
二、核心方案:自定义 Bridge 网络(最推荐)
这是笔者在日常开发中最常用,也是官方最推荐的方式。核心思想是:自己建一座桥,让容器都上这座桥。这样,它们之间不仅能通过 IP 通信,更重要的是,可以直接通过 容器名 进行 DNS 解析。
实操步骤一:创建自定义网络
打开你的终端,执行下面的命令,创建一个名为 my-net 的桥接网络:
docker network create my-net
这个命令执行完,你就拥有了一个独立的、干净的虚拟网络。
实操步骤二:启动容器并挂载网络
接下来,咱们启动两个测试容器。比如一个 Nginx,一个 Ubuntu。关键参数是 --network 和 --network-alias(或者直接用容器名)。
# 启动第一个容器
docker run -itd --name web-server --network my-net nginx
# 启动第二个容器
docker run -itd --name app-client --network my-net ubuntu /bin/bash
注意看,我们给两个容器都指定了 --network my-net。重点来了:在自定义网络中,Docker 内置了 DNS 服务。这意味着,你在 app-client 容器里,可以直接通过 ping web-server 或者访问 http://web-server 来通信,而不用关心 web-server 的 IP 是多少。
实操步骤三:验证互通性
我们进入 app-client 容器,尝试解析一下 web-server:
docker exec -it app-client bash
# 进入容器后执行
apt-get update && apt-get install -y iputils-ping curl
ping web-server
你会看到,PING 请求成功返回,域名被解析成了类似 172.x.x.x 的内网 IP。这就说明,两个容器已经通过自定义网络实现了稳定的、基于容器名的通信。
这种方式的优势在于:容器重建、升级、迁移,只要容器名不变,代码里的连接地址就永远不用改。对于微服务架构来说,这是最基础也是最重要的一环。
三、备选方案:Legacy 容器互连(–link,不推荐)
有些老项目或者老教程里会提到 --link 参数。笔者在这里明确告诉大家,不推荐在新项目里使用。这个参数是 Docker 早期的功能,它只能在单机环境下,通过往 /etc/hosts 文件里写死 IP 来实现互通。一旦容器重启导致 IP 变化,link 关系就可能失效。而且它的环境变量注入方式也比较繁琐,容易造成配置混乱。
如果你还在维护老项目,看到 --link 可以理解它的含义,但新写的代码,请毫不犹豫地使用上文的自定义网络方式。
四、进阶玩法:跨主机容器互通
上面的方案解决的是单台服务器上的容器互通。如果你的业务量上来了,两台服务器分别跑着不同的容器,怎么让它们像一个局域网一样互联?
这就需要用到 Overlay 网络(通常配合 Docker Swarm 或 Kubernetes 使用)。这种模式比较复杂,涉及 VXLAN 隧道技术,配置起来相对繁琐。对于大多数个人开发者或者中小企业来说,前期用单台服务器 + Bridge 网络完全够用了。如果真要上多机部署,笔者的建议是直接考虑 K8s 或者托管云服务,没必要自己造轮子。
五、常见坑点与排查思路
实操过程中难免踩坑,这里给大家列几个最常见的“通不了”的原因,方便你自查:
- 网络没选对:很多朋友用
docker-compose时,没注意给服务指定同一个网络。请检查你的docker-compose.yml文件,确保所有服务都在同一个networks段下面。 - 防火墙拦截:宿主机开了防火墙,虽然容器间走的是虚拟网桥,但某些安全策略可能会阻断转发。可以检查一下 iptables 规则。
- 端口未暴露:如果是从宿主机访问容器,记得要用
-p参数做端口映射。但如果是容器间互访,不需要映射端口,直接使用容器端口即可。比如 Nginx 监听 80,另一个容器直接访问web-server:80就行。 - 容器内服务未监听:确认一下你的应用是不是监听了
0.0.0.0而不是127.0.0.1。如果应用只监听本地回环地址,外部容器是永远连不进来的。
六、总结与建议
写到这里,关于 docker 两个容器互通 的常用方法就讲得差不多了。咱们回顾一下核心要点:
| 方案 | 适用场景 | 稳定性 | 推荐指数 |
|---|---|---|---|
| 默认 Bridge 网络 | 临时测试,单容器 | 低(IP易变) | ⭐ |
| 自定义 Bridge 网络 | 单机多容器正式环境 | 高(DNS解析) | ⭐⭐⭐⭐⭐ |
| –link 参数 | 老项目维护 | 低(已废弃趋势) | ⭐ |
| Overlay 网络 | 跨主机集群 | 中高 | ⭐⭐⭐⭐ |
最后,站长想多说一句。Docker 技术虽然好用,但底层依赖的还是稳定的基础设施。如果你在本地跑得飞起,一上服务器就各种网络超时,不妨检查一下你的云服务器带宽和性能。笔者自己用的几台服务器,无论是做测试还是跑业务,都比较看重 网络质量 和 I/O 性能。如果你正在纠结选哪家云厂商,或者想要一个性价比高、网络稳定的环境来部署 Docker 应用,欢迎随时找我聊聊,我可以根据你的预算和场景给你一些实在的建议。
希望这篇文章能帮你解决容器互通的问题。如果觉得有用,别忘了分享给身边同样被 Docker 网络困扰的朋友。
延伸阅读
- Linux服务器安全设置,这几招从入门到进阶,让你的服务器像铁桶一样稳
- Linux服务器裸奔?这份防护清单,帮你把系统焊成铁桶
- 自己动手搭建私有云?聊聊开源Docker云平台的那些事儿
- Linux服务与安全管理:从零搭建到加固,这些实战细节越早知道越好
🎁 全套实操配置文件与 AI 提效资料包免费下载
本文涉及的全套 Docker Compose 配置文件、服务器运维避坑手册及 AI 提效指令库已完整打包上传至夸克网盘,可直接免费极速转存:
💡 提示:推荐使用手机【夸克网盘 App】打开保存,新用户首月免费赠送 1TB 超大空间与免流量极速下载特权。