4. Docker 与容器化部署:安装、仓库、网络与资源限制

在倒排索引缓存一致性闭环中,各组件(索引构建器、缓存代理、一致性校验器、监控采集器)需要以微服务形式独立运行。Docker 容器化部署能够提供环境一致性、快速扩缩容与资源隔离能力。本节围绕 Docker 安装、镜像仓库配置、容器网络规划与资源限制四个核心环节展开,确保闭环环境可复现、可运维。

4.1 Docker 安装与引擎验证

Docker 支持主流 Linux 发行版、macOS 与 Windows。生产环境推荐使用 Ubuntu 22.04 LTS 或 CentOS 7.9+,并采用官方仓库安装方式,确保获取最新稳定版本。

操作系统 安装方式 推荐版本 内核要求
Ubuntu 22.04 apt 官方仓库 24.0.7+ ≥ 5.15
CentOS 7.9 yum 官方仓库 24.0.7+ ≥ 3.10
macOS (Apple Silicon) Docker Desktop 4.27+ —
Windows Server 2022 Docker EE / Mirantis 24.0.7+ Hyper-V 启用

安装后验证命令:

# 检查 Docker 引擎状态
sudo systemctl status docker

# 验证客户端与服务器版本
docker version --format '{{.Server.Version}}'

# 运行 hello-world 测试容器
docker run hello-world

# 确认容器运行时为 containerd
docker info | grep -i runtime

生产环境建议: 使用 docker-ce 而非 docker.io;安装后立即将普通用户加入 docker 组,避免每次执行 sudo。同时开启 live-restore 特性,使 Docker 守护进程重启时不停止运行中的容器。

4.2 镜像仓库配置与私有 Registry

闭环环境涉及多个定制镜像(如倒排索引构建器、缓存一致性代理),不宜全部依赖 Docker Hub。需要搭建私有镜像仓库或配置可信镜像仓库加速器,实现镜像的快速拉取与版本管理。

4.2.1 仓库类型对比

仓库类型 适用场景 认证方式 存储后端
Docker Hub 公共基础镜像 Token / OAuth 云端
Harbor (企业级) 私有镜像 + 漏洞扫描 LDAP / OIDC S3 / 本地
Nexus Repository 多制品统一管理 本地 / SSO Blob Store
Docker Registry (轻量) 开发测试环境 HTTP Basic 本地文件系统

4.2.2 搭建轻量私有 Registry

# 启动 Registry 容器(端口 5000)
docker run -d \
  --name registry \
  --restart=always \
  -p 5000:5000 \
  -v /data/registry:/var/lib/registry \
  registry:2.8.3

# 配置 Docker 信任 HTTP 仓库(/etc/docker/daemon.json)
{
  "insecure-registries": ["192.168.1.100:5000"],
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}

# 重启 Docker 使配置生效
sudo systemctl restart docker

# 推送镜像示例
docker tag inverted-index-builder:1.0 192.168.1.100:5000/inverted-index-builder:1.0
docker push 192.168.1.100:5000/inverted-index-builder:1.0

安全注意: 生产环境禁止使用 insecure-registries。必须配置 TLS 证书,或通过 Harbor 等企业级仓库实现 HTTPS 传输。镜像标签应遵循语义化版本(如 1.2.3),避免使用 latest 标签部署到生产。

4.3 容器网络规划

倒排索引缓存一致性闭环包含多个服务间的通信:索引构建器向缓存代理写入数据、一致性校验器定期扫描缓存、监控采集器拉取各节点指标。合理的网络规划能隔离流量、降低延迟并提升安全性。

4.3.1 网络模式选择

网络模式 隔离级别 跨主机通信 推荐场景
bridge (默认) 单机隔离 需端口映射 开发环境
host 无隔离 直接使用宿主机 IP 性能敏感型
overlay 跨主机隔离 内置 DNS 解析 生产集群
macvlan 物理网络直通 独立 MAC 地址 遗留系统对接

4.3.2 闭环环境网络拓扑

采用 overlay 网络 + docker-compose 方式,将闭环组件划分为三个子网:

  • 数据平面网络(10.88.1.0/24):索引构建器 ↔ 缓存代理 ↔ 一致性校验器
  • 管理平面网络(10.88.2.0/24):监控采集器 ↔ Prometheus / Grafana
  • 外部接入网络(10.88.3.0/24):API 网关 ↔ 客户端请求
闭环容器网络拓扑(Overlay 多子网) 数据平面网络 10.88.1.0/24 索引构建器 10.88.1.10 缓存代理 10.88.1.20 一致性校验器 10.88.1.30 管理平面网络 10.88.2.0/24 监控采集器 Prometheus Grafana 外部接入网络 10.88.3.0/24 API 网关 (10.88.3.1) 客户端请求 路由转发

4.3.3 创建 overlay 网络

# 初始化 Swarm 集群(仅 Manager 节点执行)
docker swarm init --advertise-addr 192.168.1.100

# 创建 overlay 网络(附加可附加选项使普通容器也能接入)
docker network create -d overlay \
  --subnet=10.88.1.0/24 \
  --gateway=10.88.1.1 \
  --attachable \
  data-plane-net

docker network create -d overlay \
  --subnet=10.88.2.0/24 \
  --gateway=10.88.2.1 \
  --attachable \
  mgmt-plane-net

docker network create -d overlay \
  --subnet=10.88.3.0/24 \
  --gateway=10.88.3.1 \
  --attachable \
  external-plane-net

# 查看网络列表
docker network ls | grep plane

网络规划要点: 使用 --attachable 标志使 overlay 网络同时支持 Swarm 服务和 docker-compose 启动的独立容器。每个子网预留 .1 地址给网关,.2-.10 保留给基础设施,.11 起分配给业务容器。

4.4 资源限制设置

倒排索引构建器是 CPU 密集型任务,缓存代理对内存敏感,一致性校验器需要稳定的 I/O 吞吐。必须为每个容器设置合理的资源上限,防止单组件抢占宿主机资源导致整个闭环抖动。

4.4.1 资源限制参数

参数 作用 单位 示例值
--cpus 限制 CPU 核心数 浮点数 1.5
--memory 最大内存上限 m/g 512m
--memory-reservation 内存软限制(尽力保证) m/g 256m
--blkio-weight 块 I/O 优先级 (10-1000) 整数 500
--pids-limit 最大进程数 整数 200

4.4.2 闭环组件资源分配方案

# 索引构建器:CPU 密集型,分配 2 核 + 1G 内存
docker run -d --name index-builder \
  --cpus="2.0" \
  --memory="1g" \
  --memory-reservation="768m" \
  --blkio-weight="800" \
  --pids-limit="300" \
  --network data-plane-net \
  --ip 10.88.1.10 \
  registry:5000/inverted-index-builder:1.0

# 缓存代理:内存敏感,分配 1 核 + 2G 内存(含缓存空间)
docker run -d --name cache-proxy \
  --cpus="1.0" \
  --memory="2g" \
  --memory-reservation="1.5g" \
  --blkio-weight="600" \
  --pids-limit="200" \
  --network data-plane-net \
  --ip 10.88.1.20 \
  registry:5000/cache-proxy:1.0

# 一致性校验器:I/O 中等,分配 0.5 核 + 512M 内存
docker run -d --name consistency-checker \
  --cpus="0.5" \
  --memory="512m" \
  --memory-reservation="256m" \
  --blkio-weight="400" \
  --pids-limit="100" \
  --network data-plane-net \
  --ip 10.88.1.30 \
  registry:5000/consistency-checker:1.0

# 监控采集器:轻量,分配 0.2 核 + 256M 内存
docker run -d --name metrics-collector \
  --cpus="0.2" \
  --memory="256m" \
  --memory-reservation="128m" \
  --pids-limit="50" \
  --network mgmt-plane-net \
  --ip 10.88.2.10 \
  registry:5000/metrics-collector:1.0

4.4.3 使用 docker-compose 统一管理资源限制

version: '3.8'

services:
  index-builder:
    image: registry:5000/inverted-index-builder:1.0
    networks:
      data-plane:
        ipv4_address: 10.88.1.10
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 1g
        reservations:
          cpus: '1.0'
          memory: 768m
    pids_limit: 300
    blkio_config:
      weight: 800

  cache-proxy:
    image: registry:5000/cache-proxy:1.0
    networks:
      data-plane:
        ipv4_address: 10.88.1.20
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 2g
        reservations:
          cpus: '0.5'
          memory: 1.5g
    pids_limit: 200
    blkio_config:
      weight: 600

  consistency-checker:
    image: registry:5000/consistency-checker:1.0
    networks:
      data-plane:
        ipv4_address: 10.88.1.30
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512m
        reservations:
          cpus: '0.25'
          memory: 256m
    pids_limit: 100
    blkio_config:
      weight: 400

  metrics-collector:
    image: registry:5000/metrics-collector:1.0
    networks:
      mgmt-plane:
        ipv4_address: 10.88.2.10
    deploy:
      resources:
        limits:
          cpus: '0.2'
          memory: 256m
        reservations:
          cpus: '0.1'
          memory: 128m
    pids_limit: 50

networks:
  data-plane:
    external: true
    name: data-plane-net
  mgmt-plane:
    external: true
    name: mgmt-plane-net

资源限制避坑:

  • --memory 是硬限制,超过后容器会被 OOM Kill;--memory-reservation 是软限制,仅在宿主机内存压力时生效。
  • CPU 限制使用 CFS 调度器,--cpus 为 1.0 表示占用 1 个核心的 100% 时间片,非物理核心数。
  • 块 I/O 权重仅在 cfq 或 bfq 调度器下生效,生产环境建议使用 bfq。
  • 设置 --pids-limit 可防止 fork 炸弹,Java 应用建议设为 200-500。

4.5 部署验证与监控

完成容器启动后,执行以下验证步骤确保闭环环境就绪:

  1. 网络连通性验证: 进入 index-builder 容器,ping cache-proxy 的 IP 10.88.1.20
  2. 资源限制生效验证: 使用 docker stats 实时查看各容器 CPU/内存使用上限
  3. 镜像拉取验证: 在 Worker 节点执行 docker pull registry:5000/inverted-index-builder:1.0
  4. 跨子网路由验证: 从 metrics-collector 访问 cache-proxy 的监控端口(需配置路由或使用服务发现)
# 验证网络连通性
docker exec index-builder ping -c 3 10.88.1.20

# 查看资源限制是否生效
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"

# 验证容器内 cgroup 限制
docker exec cache-proxy cat /sys/fs/cgroup/memory/memory.limit_in_bytes

闭环环境就绪检查清单:

  • ✅ Docker 引擎版本 ≥ 24.0,containerd 运行时
  • ✅ 私有 Registry 可访问,镜像标签规范
  • ✅ Overlay 网络创建完成,子网不冲突
  • ✅ 每个容器设置了 CPU、内存、PIDs 限制
  • ✅ 跨容器网络通信正常,监控采集可达