docker swarm网络类型
bridge 网络
用途:通常用于单个 Docker 节点的容器通信。容器可以通过 bridge 网络连接到宿主机,但无法与 Swarm 集群中的其他节点直接通信。
特点:默认在 Docker Engine 上启用。每个容器分配一个私有 IP 地址,并通过 NAT(网络地址转换)与外部通信。
适用场景:适合在单节点 Docker 环境下使用,不建议在多节点 Swarm 集群中使用。
overlay 网络
用途:用于跨多个 Docker Swarm 节点连接容器,为分布式应用提供内部通信的能力。
特点:在 Swarm 节点之间创建虚拟网络隧道,使容器能够通过内部 IP 地址进行通信,无需公开端口。可以实现安全的数据隔离。
适用场景:最常用于多节点 Swarm 集群,支持容器跨节点通信,比如微服务架构的内部通信。
host 网络
用途:容器直接使用宿主机的网络栈,类似于与宿主机共享网络。
特点:容器不再拥有单独的网络命名空间,因此端口冲突需要特别注意。与宿主机网络通信更直接,无需 NAT 转换。
适用场景:适用于需要高性能网络的应用,特别是在宿主机和容器之间频繁通信的场景。
macvlan 网络
用途:为容器分配与宿主机处于同一局域网的 MAC 地址,允许容器像物理网络中的独立设备一样访问网络。
特点:提供更好的网络隔离和性能,但配置复杂,通常需要对网络有较深理解。
适用场景:适用于希望容器有独立 IP 地址的场景,如模拟真实网络环境或需要容器直接连接到物理网络。
docker_gwbridge 网络
用途:这是 Docker 自动创建的一个 bridge 网络,用于 Swarm 集群内 overlay 网络与外部网络之间的通信。
特点:当 Swarm 节点内的容器需要访问外部网络时,流量会经过 docker_gwbridge 网络,以支持跨节点和外部的通信需求。
适用场景:在 Swarm 集群中启用 overlay 网络时自动创建,通常不需要手动配置,但在特定场景下,如自定义 IPv6 支持时,可以进行手动配置。
配置步骤
假设swarm集群有两个节点manager和worker,服务部署在worker上,需要让服务能够访问公网ipv6。
脱离当前集群
在worker上执行:
docker swarm leave --force
启用宿主机ipv6
验证宿主机是否启用ipv6:
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
输出0则表示已启用,若输出1则需要编辑配置文件:
vi /etc/sysctl.conf
在末尾添加:
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
生效更改:
sysctl -p
启用宿主机网络接口ipv6
编辑配置文件:
vi /etc/sysconfig/network-scripts/ifcfg-{网络接口}
在末尾添加:
IPV6INIT=yes
IPV6_AUTOCONF=yes
重启网络服务:
systemctl restart network
修改docker默认网络配置
编辑配置文件:
vi /etc/docker/daemon.json
添加:
{
"ipv6": true,
"fixed-cidr-v6": "240e:123:123:123:123:123::/64",
"ip6tables": true,
"experimental":true
}
重启docker服务:
systemctl restart docker
修改docker_gwbridge网络配置
删除原网络:
docker network rm docker_gwbridge
创建新网络:
docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 --ipv6 --subnet 240e:123:123:123:123:123::/64 --opt com.docker.network.bridge.enable_icc=true --opt com.docker.network.bridge.enable_ip_masquerade=true --opt com.docker.network.bridge.enable_ip_forwarding=true --opt com.docker.network.bridge.name=docker_gwbridge docker_gwbridge
验证docker_gwbridge网络是否启用ipv6:
docker network inspect docker_gwbridge
重新加入集群
在worker上执行:
docker swarm join --token