Docker Swarm容器通信咨询:集群搭建与服务部署后的通信实现
如何实现Docker Swarm集群中服务容器间的通信
嘿,你已经成功搭建Swarm集群并启动了基础服务,这一步做得很扎实!下面我来给你详细讲讲Swarm环境下服务间通信的核心方法,都是生产环境里常用的方案:
1. 利用Swarm原生的覆盖网络(Overlay Network)
Docker Swarm的服务发现和跨节点通信完全依赖覆盖网络——这是一种跨节点的虚拟网络,能让集群内的服务直接通过名称互相访问,不需要依赖宿主机IP。
操作步骤:
- 首先创建一个专属的覆盖网络(不推荐用默认的
ingress网络,它主要负责外部流量的负载转发):docker network create --driver overlay my-app-network - 将现有服务连接到这个网络(或者在创建服务时直接指定):
- 给已创建的服务添加网络:
docker service update --network-add my-app-network nginx docker service update --network-add my-app-network php docker service update --network-add my-app-network postgres - 后续创建新服务时,直接加入网络:
docker service create --replicas 1 --name nginx --network my-app-network nginx --publish published=80,target=80
- 给已创建的服务添加网络:
通信方式:
加入同一个覆盖网络后,服务之间可以直接通过服务名称+目标端口通信:
- Nginx配置里访问PHP-FPM:直接写
php:9000(Swarm内置的DNS服务会自动解析到PHP服务的容器节点) - 后端应用访问PostgreSQL:用
postgres:5432作为数据库连接地址
2. 端口发布的优化建议
你之前创建PHP和PostgreSQL服务时,命令里的published参数格式有小问题(缺少--publish前缀),而且其实服务间通信不需要把这些端口发布到宿主机——只需要把Nginx的80端口对外暴露即可,内部服务的端口在覆盖网络里可以直接访问,这样能减少不必要的攻击面,提升安全性。
修正后的PHP服务创建命令(不对外发布端口):
docker service create --replicas 1 --name php --network my-app-network php:7.1-fpm
PostgreSQL同理(记得添加密码环境变量,避免无密码访问):
docker service create --replicas 1 --name postgres --network my-app-network -e POSTGRES_PASSWORD=your-secure-password postgres:9.5
3. 验证通信的小技巧
可以在Nginx容器里快速测试和其他服务的连通性:
- 进入任意一个Nginx容器:
docker exec -it $(docker ps --filter name=nginx -q | head -n1) bash - 安装测试工具(比如
telnet):apt update && apt install -y telnet - 测试连接PHP服务:
能看到连接成功的提示就说明通信正常。telnet php 9000 - 测试连接PostgreSQL服务:
输入你设置的PostgreSQL密码就能成功连接数据库。apt install -y postgresql-client psql -h postgres -U postgres
内容的提问来源于stack exchange,提问作者jhonatan teixeira
相关产品推荐
相关产品推荐

