2个节点的docker容器网络实现通信过程
作者:喝醉酒的小白
文章介绍了五种实现跨节点Docker容器通信的方法,涵盖host网络、Swarm集群、网络插件和自建VPN,适用于不同场景如调试、生产环境及高可用需求,并推荐根据部署复杂度选择方案
在两个节点(物理机或虚拟机)上运行的 Docker 容器之间实现网络通信,主要有以下几种方式,具体选择取决于你的部署需求、复杂性接受度以及是否使用编排工具(如 Docker Swarm 或 Kubernetes)。
常用方案汇总
方案一:使用host网络 + 宿主机 IP 访问(简单)
- 容器运行时使用
--network host
(仅限 Linux) - 通过节点的 IP 地址进行通信,例如:
节点A容器 -> curl http://<节点B的IP>:端口/
适合:快速调试、小规模部署
缺点:不适用于跨平台(如 Mac/Windows),端口暴露在宿主机上,可能存在安全隐患。
方案二:通过宿主机端口映射 + 公有或内网 IP 访问(通用)
- 每个容器启动时用
-p
暴露端口,例如:
docker run -d -p 8080:80 --name web nginx
- 让另一个节点通过 IP + 映射端口访问:
curl http://<对方主机IP>:8080
- 适合:多节点手动管理通信
- 缺点:需要管理端口映射;跨主机容器发现复杂
方案三:Docker Swarm 网络(官方跨主机 overlay 网络)
- 初始化 Swarm 集群:
docker swarm init --advertise-addr <节点1IP>
- 加入其他节点(会生成
docker swarm join
命令) - 创建 overlay 网络:
docker network create -d overlay mynet
- 使用该网络运行容器:
docker service create --name web --network mynet nginx
- 适合:生产环境,服务自动发现
- 需要学习 Swarm;容器必须用
docker service
管理(不是docker run
)
方案四:使用独立网络插件(如 Weave, Calico, flannel)
这些工具为 Docker 提供跨主机容器网络
类似于 Kubernetes CNI 网络插件
- 适合:高可用需求、复杂网络拓扑
- 配置复杂,需额外工具学习
方案五:自建 VPN(如 Tinc、WireGuard)实现跨主机容器通信
把所有节点接入同一虚拟网络
容器绑定 --network bridge
,通过虚拟 IP 通信
- 适合:定制化网络
- 运维成本高
推荐做法(具体场景推荐)
场景 | 推荐方案 |
---|---|
简单调试或临时通信 | 方案一、方案二 |
生产集群容器管理 | 方案三(Docker Swarm) |
高可用+容器发现+安全网络 | 方案三或方案四 |
已部署私有 VPN 网络 | 方案五 |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。