Docker集群

在 Docker Swarm 的子节点中查看所有网络时,需要注意以下两点:

  1. 子节点只能看到与其相关的网络,例如全局范围的 overlay 网络或容器附加到的网络。

  2. 默认情况下,子节点不会显示仅在管理节点上创建但未传播到集群的网络(如未使用 --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 网络,但未在子节点上看到,可以检查以下内容:

  1. 网络是否为全局范围: 确保创建网络时使用了 overlay 驱动,且配置了 --attachable 参数(如有必要)。

docker network create -d overlay --attachable my_overlay_network

  1. 节点状态: 确保子节点处于活跃状态:

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

  1. 检查服务是否正确连接网络: 如果网络没有容器或服务连接,可能不会在子节点上显示。尝试运行以下命令查看服务状态:

docker service ls docker service inspect

如有进一步问题,请提供错误日志或配置细节,我可以更具体地帮助你!

在 Docker 中使用 overlay 网络可以实现跨主机的容器通信,但需要满足一些前置条件。以下是详细的操作步骤:


前置条件

  1. 启用 Docker Swarm 模式 overlay 网络需要 Docker Swarm 支持。确保集群已经初始化并至少包含两个节点:

docker swarm init

如果需要将其他主机加入集群,运行以下命令获取加入命令:

docker swarm join-token worker

在其他主机上运行输出的 docker swarm join 命令。

  1. 网络互通 集群中的所有主机必须能够通过以下端口相互通信:

TCP/UDP 2377(集群管理通信)

TCP/UDP 7946(节点间通信)

UDP 4789(Overlay 网络数据)

检查防火墙规则或云安全组配置,确保这些端口已开放。


创建 Overlay 网络

  1. 在管理节点上创建 overlay 网络:

docker network create -d overlay --attachable my_overlay_network

-d overlay:指定网络驱动为 overlay。

--attachable:允许独立的容器附加到该网络。

  1. 确认网络已成功创建:

docker network ls


在服务中使用 Overlay 网络

  1. 创建一个服务并连接到 overlay 网络:

docker service create --name my_service --network my_overlay_network nginx

该服务会在集群中的某个节点启动,其他节点也可以通过 overlay 网络访问它。

  1. 检查服务状态:

docker service ls docker service ps my_service


在独立容器中使用 Overlay 网络

如果希望单个容器加入 overlay 网络,可以执行以下命令:

  1. 在集群中的任意节点启动容器并附加到网络:

docker run -dit --name test_container --network my_overlay_network alpine

  1. 验证网络互通:

在另一个节点的容器中尝试 ping 上述容器的 IP 地址。


排查网络问题

如果网络无法通信,请检查以下内容:

  1. Swarm 集群状态:

docker node ls

确保所有节点状态为 Active。

  1. 网络连接: 使用工具如 telnet 或 ping 验证端口和节点之间的连接。

  2. 容器日志: 查看容器日志排查服务是否正常运行:

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 的步骤:


  1. 为服务指定静态 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 # 表示使用已存在的网络


  1. 部署服务

运行以下命令,将服务部署到 Docker Swarm 中:

docker stack deploy -c docker-compose.yml my_stack


  1. 验证网络和 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" } }


  1. 为独立容器设置静态 IP

如果需要为独立容器设置静态 IP,可以运行以下命令:

docker run -dit --name my_container \ --network teds_wd_ovnet \ --ip 192.168.88.200 \ nginx


注意事项

  1. 静态 IP 地址范围:确保为服务或容器分配的静态 IP 地址在 192.168.88.0/24 子网范围内且唯一。

  2. 使用动态 IP 的服务:对于不需要静态 IP 的服务,可以省略 ipv4_address,Docker 会自动分配。

  3. 外部网络声明:在 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 # 临时目录,建议和包目录在同一个磁盘分区,否则会跨分区移动文件