docker跨主机通信
最近在搭建一个分布式linux性能监控项目,需要实现不同宿主机中的docker通信问题,记录一下过程。
1. swarm集群创建
- 初始化swarm:将当前主机设置为swarm管理节点
docker swarm init
- 获取 Swarm 集群初始化令牌:在现有的 Swarm 管理节点上,使用以下命令获取加入集群所需的令牌:
docker swarm join-token worker
这将生成一个加入令牌,你需要将这个令牌提供给要加入集群的工作节点
- 在要加入的节点上执行加入命令:在要加入 Swarm 集群的每个节点上,使用上一步中生成的加入令牌执行以下命令:
docker swarm join --token <token> <manager-ip>:<port>
其中,<token>
是在上一步生成的加入令牌,<manager-ip>
是 Swarm 管理节点的 IP 地址,<port>
是 Swarm 管理节点的监听端口(默认为 2377)。
- 验证节点是否成功加入集群:在 Swarm 管理节点上,执行以下命令来列出集群中的所有节点:
docker node ls
- 打开通信端口:确保swarm通信服务所需要端口是可用的
以ubuntu为例
#安装防火墙
#sudo apt update
#sudo apt install ufw
#启用防火墙
#sudo ufw enable
#允许特定端口
sudo ufw allow <port_number>
#拒绝特定端口
sudo ufw deny <port_number>
#拒绝/允许特定协议和端口号
sudo ufw allow <port_number>/<protocol>
#查看当前规则
sudo ufw status
Swarm 管理节点:
TCP 端口 2377:用于集群管理通信。
TCP 和 UDP 端口 7946:用于节点之间的通信。
UDP 端口 4789:用于 Overlay 网络通信。
2. 集群网络创建
- 创建网络:集群中节点通信需要创建overlay网络
docker network create --driver overlay --attachable my_network
- 检查网络:检查网络是否创建成功,一般在管理节点(初始化swarm网络的主机)上可以通过一下命令查看到网络信息,worker节点看不到创建的overlay网络信息,据说是要worker节点中使用这个网络,才能看到
docker network ls
- 服务连接到网络: 将需要跨宿主机通信的服务连接到网络
docker service create --name my_service --network my_network image_name
#其实也可以
docker run -it -d --name <docker_name> --net=my_network <images_name>
- 查看容器中的网络配置 :查看容器中网络配置
docker inspect <docker_name>