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 网关 ↔ 客户端请求
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 部署验证与监控
完成容器启动后,执行以下验证步骤确保闭环环境就绪:
- 网络连通性验证: 进入 index-builder 容器,ping cache-proxy 的 IP 10.88.1.20
- 资源限制生效验证: 使用
docker stats实时查看各容器 CPU/内存使用上限 - 镜像拉取验证: 在 Worker 节点执行
docker pull registry:5000/inverted-index-builder:1.0 - 跨子网路由验证: 从 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 限制
- ✅ 跨容器网络通信正常,监控采集可达