当前位置: 首页 > news >正文

Docker容器化高可用架构部署方案(三)

02-网络创建

本文档详细介绍如何在所有节点上创建5个Macvlan网络,这些网络将用于隔离不同服务层的通信。

Macvlan网络概述

Macvlan允许容器直接连接到物理网络,每个容器拥有独立的MAC地址,看起来就像网络上的物理机。

本项目网络规划

网络名称子网网关IP范围用途
frontend-net172.20.1.0/24172.20.1.1172.20.1.11-13Nginx-LB、Keepalived VIP
backend-net172.20.2.0/24172.20.2.1172.20.2.11-23PHP服务、PHP-FPM
cache-net172.20.3.0/24172.20.3.1172.20.3.11-33Redis、Sentinel
database-net172.20.4.0/24172.20.4.1172.20.4.11-13MySQL MGR
manage-net172.20.5.0/24172.20.5.1172.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 - 创建所有配置文件

http://www.jsqmd.com/news/810570/

相关文章:

  • 别再死记硬背了!用5个工业现场案例,帮你彻底搞懂液压与气动系统
  • 什么是Docker
  • ARM-2D:为Cortex-M GUI注入“灵魂”的2D加速库
  • 半导体并购新范式:从外科手术到生态位投资的战略演变
  • MCP与n8n集成:AI智能体调用自动化工作流实战指南
  • 技术媒体进化论:从行业记录者到工程师社区的40年蜕变
  • HexHub全面支持国产数据库以及AI助手
  • 连锁不平衡热图绘制神器:LDBlockShow快速入门与实战指南
  • ArcGIS线要素编辑进阶:除了画线,这5个高效编辑技巧让你事半功倍
  • 滚珠丝杆反向间隙全解:从产生机理到工程补偿(附盘岩科技PKH40实测数据与选型指南)
  • 第27章 案例25:网页随机抽奖效果【JS常用全局方法】【JS进阶篇】
  • Day1 3D的方块翻滚
  • 从‘采样失败’到‘波形光滑’:单电阻FOC电流重构的全流程避坑指南
  • 技术会议价值挖掘:从ESC嵌入式会议看高ROI参会方法论
  • 【c++笔记】类和对象流食般投喂(上)
  • Beyond Compare 5密钥生成器技术架构与实现原理深入解析
  • 智能卫浴行业品牌升级咨询:以奇正沐古与恒洁卫浴为例 - 品牌速递
  • 动态标定自修正·跨镜ID恒定·轨迹时序无断链 技术专项解析
  • 利用Taotoken多模型聚合能力优化AI应用选型成本
  • 物联网操作系统Zephyr(蓝牙篇)之6.1 实战解析:Zephyr蓝牙协议栈的三种构建模式与应用选型
  • CodeBuddy 客户端 ECONNREFUSED 错误排查实录
  • NoFences:免费开源桌面分区工具,让Windows桌面告别混乱的终极解决方案
  • 用ccagents优雅管理Claude Code智能体:符号链接与声明式配置实战
  • CTF SHOW WEB入门79
  • 2026性价比高的插座品牌推荐及选购参考 - 品牌排行榜
  • Adobe-GenP 3.0:5分钟快速激活Adobe全家桶的终极指南
  • 2026年保姆级攻略:论文如何避开AI检测高风险坑,一次过审! - 降AI实验室
  • Cursor Free VIP:智能破解Cursor Pro限制的实用工具完全指南
  • ctfshow靶场SSRF部分——基础绕过到协议攻击解题思路与技巧(一)
  • 极域电子教室终极破解指南:如何简单快速解除课堂控制限制