Docker容器化高可用架构部署方案(三)
02-网络创建
本文档详细介绍如何在所有节点上创建5个Macvlan网络,这些网络将用于隔离不同服务层的通信。
Macvlan网络概述
Macvlan允许容器直接连接到物理网络,每个容器拥有独立的MAC地址,看起来就像网络上的物理机。
本项目网络规划
| 网络名称 | 子网 | 网关 | IP范围 | 用途 |
|---|---|---|---|---|
| frontend-net | 172.20.1.0/24 | 172.20.1.1 | 172.20.1.11-13 | Nginx-LB、Keepalived VIP |
| backend-net | 172.20.2.0/24 | 172.20.2.1 | 172.20.2.11-23 | PHP服务、PHP-FPM |
| cache-net | 172.20.3.0/24 | 172.20.3.1 | 172.20.3.11-33 | Redis、Sentinel |
| database-net | 172.20.4.0/24 | 172.20.4.1 | 172.20.4.11-13 | MySQL MGR |
| manage-net | 172.20.5.0/24 | 172.20.5.1 | 172.20.5.13 | 备份服务(仅Node3) |
在所有节点执行
重要前提
在创建Macvlan网络之前,必须确保物理网卡ens33已确认。如果网卡名称不同,请将命令中的ens33替换为实际网卡名称。
创建frontend-net
frontend-net用于Nginx负载均衡器和Keepalived VIP:
docker network create -d macvlan \ --subnet=172.20.1.0/24 \ --gateway=172.20.1.1 \ -o parent=ens33 \ frontend-net
创建backend-net
backend-net用于PHP服务和PHP-FPM:
docker network create -d macvlan \ --subnet=172.20.2.0/24 \ --gateway=172.20.2.1 \ -o parent=ens33 \ backend-net
创建cache-net
cache-net用于Redis主从集群和Sentinel哨兵:
docker network create -d macvlan \ --subnet=172.20.3.0/24 \ --gateway=172.20.3.1 \ -o parent=ens33 \ cache-net
创建database-net
database-net用于MySQL MGR集群:
docker network create -d macvlan \ --subnet=172.20.4.0/24 \ --gateway=172.20.4.1 \ -o parent=ens33 \ database-net
创建manage-net
manage-net用于Node3上的备份服务:
docker network create -d macvlan \ --subnet=172.20.5.0/24 \ --gateway=172.20.5.1 \ -o parent=ens33 \ manage-net
一键创建所有网络
为简化操作,可以一次性创建所有5个网络:
# 创建frontend-net docker network create -d macvlan --subnet=172.20.1.0/24 --gateway=172.20.1.1 -o parent=ens33 frontend-net # 创建backend-net docker network create -d macvlan --subnet=172.20.2.0/24 --gateway=172.20.2.1 -o parent=ens33 backend-net # 创建cache-net docker network create -d macvlan --subnet=172.20.3.0/24 --gateway=172.20.3.1 -o parent=ens33 cache-net # 创建database-net docker network create -d macvlan --subnet=172.20.4.0/24 --gateway=172.20.4.1 -o parent=ens33 database-net # 创建manage-net docker network create -d macvlan --subnet=172.20.5.0/24 --gateway=172.20.5.1 -o parent=ens33 manage-net
Macvlan shim接口配置
Macvlan网络有一个限制:宿主机无法直接与Macvlan网络中的容器通信(除非使用macvlan的bridge模式)。为解决这个问题,需要创建shim接口。
创建shim接口(每网络一个)
# 为frontend-net创建shim ip link add shim-frontend link ens33 type macvlan mode bridge ip addr add 172.20.1.254/24 dev shim-frontend ip link set shim-frontend up # 为backend-net创建shim ip link add shim-backend link ens33 type macvlan mode bridge ip addr add 172.20.2.254/24 dev shim-backend ip link set shim-backend up # 为cache-net创建shim ip link add shim-cache link ens33 type macvlan mode bridge ip addr add 172.20.3.254/24 dev shim-cache ip link set shim-cache up # 为database-net创建shim ip link add shim-database link ens33 type macvlan mode bridge ip addr add 172.20.4.254/24 dev shim-database ip link set shim-database up # 为manage-net创建shim(可选) ip link add shim-manage link ens33 type macvlan mode bridge ip addr add 172.20.5.254/24 dev shim-manage ip link set shim-manage up
永久化shim接口配置
为确保系统重启后shim接口仍然存在,创建systemd服务:
sudo tee /etc/systemd/system/docker-macvlan-shim.service <<'EOF' [Unit] Description=Docker Macvlan Shim Interfaces After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/bin/bash -c ' ip link add shim-frontend link ens33 type macvlan mode bridge 2>/dev/null || true ip addr add 172.20.1.254/24 dev shim-frontend 2>/dev/null || true ip link set shim-frontend up 2>/dev/null || true ip link add shim-backend link ens33 type macvlan mode bridge 2>/dev/null || true ip addr add 172.20.2.254/24 dev shim-backend 2>/dev/null || true ip link set shim-backend up 2>/dev/null || true ip link add shim-cache link ens33 type macvlan mode bridge 2>/dev/null || true ip addr add 172.20.3.254/24 dev shim-cache 2>/dev/null || true ip link set shim-cache up 2>/dev/null || true ip link add shim-database link ens33 type macvlan mode bridge 2>/dev/null || true ip addr add 172.20.4.254/24 dev shim-database 2>/dev/null || true ip link set shim-database up 2>/dev/null || true ip link add shim-manage link ens33 type macvlan mode bridge 2>/dev/null || true ip addr add 172.20.5.254/24 dev shim-manage 2>/dev/null || true ip link set shim-manage up 2>/dev/null || true ' ExecStop=/bin/bash -c ' ip link del shim-frontend 2>/dev/null || true ip link del shim-backend 2>/dev/null || true ip link del shim-cache 2>/dev/null || true ip link del shim-database 2>/dev/null || true ip link del shim-manage 2>/dev/null || true ' RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable docker-macvlan-shim.service sudo systemctl start docker-macvlan-shim.service
网络验证
查看已创建的网络
docker network ls
预期输出:
NETWORK ID NAME DRIVER SCOPE xxxxxxxxxxxx bridge bridge local xxxxxxxxxxxx host host local xxxxxxxxxxxx none null local xxxxxxxxxxxx frontend-net macvlan local xxxxxxxxxxxx backend-net macvlan local xxxxxxxxxxxx cache-net macvlan local xxxxxxxxxxxx database-net macvlan local xxxxxxxxxxxx manage-net macvlan local
查看网络详情
docker network inspect frontend-net docker network inspect backend-net docker network inspect cache-net docker network inspect database-net docker network inspect manage-net
验证shim接口
ip addr show | grep shim-
预期输出:
XX: shim-frontend: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP inet 172.20.1.254/24 scope global shim-frontend XX: shim-backend: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP inet 172.20.2.254/24 scope global shim-backend XX: shim-cache: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP inet 172.20.3.254/24 scope global shim-cache XX: shim-database: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP inet 172.20.4.254/24 scope global shim-database XX: shim-manage: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP inet 172.20.5.254/24 scope global shim-manage
测试Macvlan连通性
创建测试容器并验证网络连通:
# 创建测试容器(临时使用) docker run --rm -it --network frontend-net --ip 172.20.1.200 alpine:latest sh # 在容器内测试 ping -c 3 172.20.1.1 # 测试网关 ping -c 3 172.20.1.254 # 测试宿主机shim exit
删除网络
如果需要重新创建网络,先删除旧的:
# 删除所有Macvlan网络 docker network rm frontend-net docker network rm backend-net docker network rm cache-net docker network rm database-net docker network rm manage-net # 删除shim接口 ip link del shim-frontend ip link del shim-backend ip link del shim-cache ip link del shim-database ip link del shim-manage
常见问题
Q1: 创建网络时报错"network already exists"
# 先删除再创建 docker network rm frontend-net docker network create -d macvlan --subnet=172.20.1.0/24 --gateway=172.20.1.1 -o parent=ens33 frontend-net
Q2: 创建网络时报错"invalid parent device"
检查网卡名称是否正确
确认网卡处于UP状态
检查macvlan模块是否已加载
Q3: 容器无法获取IP
检查子网是否与其他网络重叠
确认IP地址没有被占用
检查Docker版本是否支持Macvlan
下一步
完成网络创建后,请继续:
03-目录创建.md - 创建部署目录结构
04-创建配置文件.md - 创建所有配置文件
