Docker集群
在 Docker Swarm 的子节点中查看所有网络时,需要注意以下两点:
-
子节点只能看到与其相关的网络,例如全局范围的 overlay 网络或容器附加到的网络。
-
默认情况下,子节点不会显示仅在管理节点上创建但未传播到集群的网络(如未使用 --attachable 的 overlay 网络)。
以下是具体操作步骤:
步骤 1: 查看网络列表
在子节点上运行以下命令:
docker network ls
该命令会列出当前节点可见的网络,包括:
bridge、host、none 等默认本地主机网络。
与当前节点有关的 overlay 网络。
输出示例:
NETWORK ID NAME DRIVER SCOPE abc123xyz456 bridge bridge local def456xyz789 host host local ghi789xyz012 my_overlay_network overlay swarm
步骤 2: 查看具体网络的详细信息
如果希望查看某个网络的详细信息(如已连接的容器、配置等),运行以下命令:
docker network inspect
例如:
docker network inspect my_overlay_network
输出示例:
[ { "Name": "my_overlay_network", "Id": "ghi789xyz012", "Scope": "swarm", "Driver": "overlay", "EnableIPv6": false, "Containers": { "a1b2c3d4e5": { "Name": "my_container", "EndpointID": "fghijk12345", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/24", "IPv6Address": "" } } } ]
步骤 3: 验证网络是否正确传播到子节点
如果你在管理节点创建了一个 overlay 网络,但未在子节点上看到,可以检查以下内容:
- 网络是否为全局范围: 确保创建网络时使用了 overlay 驱动,且配置了 --attachable 参数(如有必要)。
docker network create -d overlay --attachable my_overlay_network
- 节点状态: 确保子节点处于活跃状态:
docker node ls
输出示例:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS x1y2z3abcd1234abcd5678efgh manager-1 Ready Active Leader x2y3z4abcd2345abcd6789ijkl worker-1 Ready Active x3y4z5abcd3456abcd7890mnop worker-2 Ready Active
- 检查服务是否正确连接网络: 如果网络没有容器或服务连接,可能不会在子节点上显示。尝试运行以下命令查看服务状态:
docker service ls
docker service inspect
如有进一步问题,请提供错误日志或配置细节,我可以更具体地帮助你!
在 Docker 中使用 overlay 网络可以实现跨主机的容器通信,但需要满足一些前置条件。以下是详细的操作步骤:
前置条件
- 启用 Docker Swarm 模式 overlay 网络需要 Docker Swarm 支持。确保集群已经初始化并至少包含两个节点:
docker swarm init
如果需要将其他主机加入集群,运行以下命令获取加入命令:
docker swarm join-token worker
在其他主机上运行输出的 docker swarm join 命令。
- 网络互通 集群中的所有主机必须能够通过以下端口相互通信:
TCP/UDP 2377(集群管理通信)
TCP/UDP 7946(节点间通信)
UDP 4789(Overlay 网络数据)
检查防火墙规则或云安全组配置,确保这些端口已开放。
创建 Overlay 网络
- 在管理节点上创建 overlay 网络:
docker network create -d overlay --attachable my_overlay_network
-d overlay:指定网络驱动为 overlay。
--attachable:允许独立的容器附加到该网络。
- 确认网络已成功创建:
docker network ls
在服务中使用 Overlay 网络
- 创建一个服务并连接到 overlay 网络:
docker service create --name my_service --network my_overlay_network nginx
该服务会在集群中的某个节点启动,其他节点也可以通过 overlay 网络访问它。
- 检查服务状态:
docker service ls docker service ps my_service
在独立容器中使用 Overlay 网络
如果希望单个容器加入 overlay 网络,可以执行以下命令:
- 在集群中的任意节点启动容器并附加到网络:
docker run -dit --name test_container --network my_overlay_network alpine
- 验证网络互通:
在另一个节点的容器中尝试 ping 上述容器的 IP 地址。
排查网络问题
如果网络无法通信,请检查以下内容:
- Swarm 集群状态:
docker node ls
确保所有节点状态为 Active。
-
网络连接: 使用工具如 telnet 或 ping 验证端口和节点之间的连接。
-
容器日志: 查看容器日志排查服务是否正常运行:
docker logs
如有具体错误或问题,随时提供更多信息,我可以帮助你解决!
version: '3.8'
networks: teds_wd_ovnet: external: true # 使用已创建的外部网络
services: app1: image: nginx networks: - my_overlay_network deploy: replicas: 2 # 指定副本数量 placement: constraints: - node.role == worker # 限制运行在 worker 节点
app2: image: alpine command: sh -c "while true; do sleep 30; done" networks: - my_overlay_network
docker network create \ --driver overlay \ --subnet=192.168.88.0/24 \ --gateway=192.168.88.1 \ --attachable \ teds_wd_ovnet
现在您已经创建了名为 teds_wd_ovnet 的网络(网段为 192.168.88.0/24),以下是如何让服务或容器使用这个网络并为个别服务设置静态 IP 的步骤:
- 为服务指定静态 IP
示例 docker-compose.yml:
version: '3.8'
services: app1: image: nginx networks: teds_wd_ovnet: ipv4_address: 192.168.88.100 # 静态 IP
app2: image: alpine command: sh -c "while true; do sleep 30; done" networks: teds_wd_ovnet: # 动态 IP
networks: teds_wd_ovnet: external: true # 表示使用已存在的网络
- 部署服务
运行以下命令,将服务部署到 Docker Swarm 中:
docker stack deploy -c docker-compose.yml my_stack
- 验证网络和 IP
使用以下命令检查网络中的服务和容器 IP:
docker network inspect teds_wd_ovnet
输出示例:
"Containers": { "abcdef123456789": { "Name": "my_stack_app1.1", "IPv4Address": "192.168.88.100/24" }, "123456abcdef789": { "Name": "my_stack_app2.1", "IPv4Address": "192.168.88.101/24" } }
- 为独立容器设置静态 IP
如果需要为独立容器设置静态 IP,可以运行以下命令:
docker run -dit --name my_container \ --network teds_wd_ovnet \ --ip 192.168.88.200 \ nginx
注意事项
-
静态 IP 地址范围:确保为服务或容器分配的静态 IP 地址在 192.168.88.0/24 子网范围内且唯一。
-
使用动态 IP 的服务:对于不需要静态 IP 的服务,可以省略 ipv4_address,Docker 会自动分配。
-
外部网络声明:在 docker-compose.yml 中使用 external: true,以便使用已创建的网络。
如需更多帮助,请随时告诉我!
networks: teds_wd_ovnet: external: true
services: dpkg_server: image: 192.168.1.25/teds/dpkg_std:v20241117-arm64-d1 restart: always networks: teds_wd_ovnet: ipv4_address: 192.168.88.3 ports: - "8083:8083" volumes: - /storage/user_data/dkpg_data:/dkpg_data environment: - GLOG_DIR=/dkpg_data/run_logs/ - SOFT_PACKAGES_DIRS=/dkpg_data/teds_nzxj_hw - EQUAL_ENDPOINTS=http://192.168.88.3:8083/,http://192.168.88.5:8083/ - USE_SYNC=1 # 使用同步,将从 EQUAL_ENDPOINTS 同步 - SYNC_INTERVAL=600 #同步间隔,秒 - INSTALL_SOFT_DIR=/teds_data/install_dir # 安装目录,不再下载已安装的包 - ONLY_SYNC_LATEST=1 # 近同步最新的,这是相对于本机已有包而言 - TMP_DIR=/dkpg_data/dpkg_tmp_dir # 临时目录,建议和包目录在同一个磁盘分区,否则会跨分区移动文件