Lazy loaded image
Docker Swarm 网络调试及问题修复
Words 623Read Time 2 min
2025-10-2
2025-11-10
date
related_level
slug
type
relate_date
summary
status
tags
category
last_updated
Nov 10, 2025 10:02 PM
是否已更新
orginal_page
是否推荐
参考资料
  • 假设已经初始化 Swarm
 

Docker Swarm 自定义网络集群测试

创建自定义 overlay 网络
  • docker network create \ --driver=overlay \ --attachable \ --opt encrypted \ --ipv6 \ --subnet=fd00:dead:beef::/64 \ overlay-openwrt
    • --ipv6 (可选)提供 ipv6 网段,默认 ipv4
    • --subnet (可选)子网网段
  • docker network inspect overlay-openwrt
  • docker network inspect docker_gwbridge
  • diff <(docker network inspect overlay-openwrt) <(docker network inspect ingress)
    • 差异比较
创建测试服务
  • docker service create --name helloworld1 \ --replicas=1 \ --network overlay-openwrt \ alpine sleep infinity
  • docker service create --name helloworld2 \ --replicas=1 \ --network overlay-openwrt \ alpine ping www.baidu.com
    • 用于比较
查看容器网络设置
  • docker container inspect --format '{{json .NetworkSettings}}' $(docker ps -f name=helloworld1 --format '{{.ID}}') | python -m json.tool
测试自定义网络连通情况
  • docker exec -it $(docker ps -f name=helloworld1 --format '{{.ID}}') /bin/sh -c "apk update && apk add busybox-extras"
    • 安装依赖以使用 telnet
  • docker exec -it $(docker ps -f name=helloworld1 --format '{{.ID}}') telnet <ip> <port>
    • 测试内部端口连通情况
  • docker exec -it $(docker ps -f name=helloworld1 --format '{{.ID}}') ping www.baidu.com
    • 测试外部连通情况
比较两个容器
  • diff <(docker container inspect --format '{{json .NetworkSettings}}' $(docker ps -f name=helloworld2 --format '{{.ID}}') | python -m json.tool) <(docker container inspect --format '{{json .NetworkSettings}}' $(docker ps -f name=helloworld1 --format '{{.ID}}') | python -m json.tool)
清理试验数据
  • docker service rm helloworld1
  • docker service rm helloworld2
  • docker network rm overlay-openwrt
 

Docker Swarm 部分网络问题及解决办法

swarm 未监听 4389 端口
  • lsof -i :2377,7946,4789
    • 2377 端口在Docker Swarm中用于管理节点之间以及与管理节点的通信
    • 7946 端口用于Docker Swarm中的 overlay 网络节点发现
    • 4789 端口用于支持Docker的 overlay 网络,使得集群中的容器能够相互通信
      • 可以配置
  • iptables -S | grep 4789
  • 重建集群调整端口
    • docker swarm leave --force
    • docker swarm init --data-path-port=7789
    • lsof -i :2377,7946,7789
  • 防火墙放行对应端口
    • iptables -I INPUT -m udp --dport 4789 -m policy --dir in --pol none -j DROP
重建 swarm 集群
  • docker swarm leave --force
  • ip link set docker_gwbridge down
  • ip link del dev docker_gwbridge
  • service dockerd stop
  • rm -rf /var/lib/docker
  • service dockerd start
  • docker swarm init --data-path-port=7789
修改 swarm 虚拟桥接 docker_gwbridge
修复 WARNING: bridge-nf-call-iptables is disabled
  • docker info 报错
    • WARNING: bridge-nf-call-iptables is disabled
    • WARNING: bridge-nf-call-ip6tables is disabled
  • vim /etc/sysctl.d/99-docker-iptables.conf
    • sysctl -p /etc/sysctl.d/99-docker-iptables.conf
    • modprobe br_netfilter
    禁用 worker 上特定端口的流量
    由于 docker 在 nat 表的 PREROUTING 链有规则 ,ufw 无法生效
    • vim /etc/ufw/applications.d/code-server.ini
      • ufw deny CodeServer
      • ufw allow CodeServerHTTPS
      • ufw enable
      • iptables -t mangle -I PREROUTING ! -i lo -p tcp --dport <port> -j DROP
        • mangle 表的 PREROUTING 链中插入规则
        • ! -i lo 排除环回地址
        • -p tcp --dport <port> 匹配 tcp 协议且目标端口为 <port> 的流量
        • -j DROP 丢弃数据包
       
      上一篇
      Docker Swarm 入门
      下一篇
      外部节点配置 smartdns 提供内网 DNS 分流

      Comments
      Loading...