2. 环境准备:Docker安装与配置、Docker Compose基础、PostgreSQL官方镜像介绍

搭建Mock依赖隔离集成测试环境,第一步是准备好容器化基础设施。Docker与Docker Compose提供了轻量、可重复的环境定义能力,配合PostgreSQL官方镜像,可以在数分钟内拉起一个与生产环境高度一致的数据库实例,且不会污染宿主机。

2.1 Docker安装与配置

Docker是容器化技术的行业标准。以下表格列出了主流操作系统上的安装方式与关键配置项。

操作系统 安装方式 推荐版本 关键配置
Ubuntu 22.04 / 24.04 官方apt仓库 Docker Engine 27.x 添加docker用户组,避免每次sudo
CentOS 7 / Rocky Linux 9 yum/dnf安装 Docker Engine 27.x 启用containerd,关闭selinux或配置规则
macOS (Intel/Apple Silicon) Docker Desktop Docker Desktop 4.x 启用VirtioFS加速,分配4GB以上内存
Windows 10/11 Docker Desktop (WSL2后端) Docker Desktop 4.x 启用WSL2,设置资源上限
配置要点:安装完成后务必执行 sudo usermod -aG docker $USER 将当前用户加入docker组,然后重新登录。这可以避免每次执行docker命令时都加sudo,简化后续操作流程。

验证安装是否成功:

docker --version
docker info | grep -E "Server Version|Storage Driver|Cgroup Driver"

输出应显示Server Version ≥ 27.x,Storage Driver为overlay2,Cgroup Driver为systemd。如果Cgroup Driver显示cgroupfs,建议修改daemon.json切换为systemd,以获得更好的资源管理兼容性。

2.2 Docker Compose基础

Docker Compose通过YAML文件定义多容器应用,是编排测试环境的首选工具。从Docker Engine 25.x开始,Compose已内置为docker compose(子命令),不再需要单独安装docker-compose二进制文件。

以下是一个典型的PostgreSQL测试环境Compose文件结构:

version: "3.9"

services:
  postgres:
    image: postgres:16-alpine
    container_name: pg-test-env
    environment:
      POSTGRES_USER: test_user
      POSTGRES_PASSWORD: test_pass
      POSTGRES_DB: test_db
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data
      - ./init-scripts:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U test_user -d test_db"]
      interval: 5s
      timeout: 3s
      retries: 5

volumes:
  pg_data:

Compose文件的核心字段说明:

字段 作用 测试环境建议
image 指定容器镜像 固定版本号,避免latest导致环境漂移
environment 注入环境变量 使用非root用户,设置强密码
ports 宿主机与容器端口映射 测试环境可映射到5432,避免端口冲突
volumes 持久化数据或挂载初始化脚本 使用命名卷,方便清理和重建
healthcheck 容器健康检查 必须配置,用于等待数据库就绪
常用命令速查:
  • docker compose up -d — 后台启动所有服务
  • docker compose down -v — 停止并删除卷(清理测试数据)
  • docker compose logs -f — 实时查看日志
  • docker compose exec postgres psql -U test_user -d test_db — 进入数据库交互终端

2.3 PostgreSQL官方镜像介绍

PostgreSQL官方镜像(postgres)由Docker官方与PostgreSQL社区共同维护,支持多个主要版本和变体。选择正确的镜像变体直接影响测试环境的启动速度、体积和兼容性。

官方镜像的主要变体对比:

镜像标签 基础镜像 镜像大小 适用场景
postgres:16 Debian Bookworm ~400MB 生产环境模拟,完整工具链
postgres:16-alpine Alpine Linux ~200MB CI/CD快速启动,体积敏感场景
postgres:16-bullseye Debian Bullseye ~380MB 兼容旧版glibc的遗留系统
postgres:16-bookworm Debian Bookworm ~400MB 当前推荐,长期支持
版本选择建议:Mock测试环境推荐使用 postgres:16-alpine 或 postgres:17-alpine。Alpine变体体积小、启动快,且包含完整的psql客户端和pg_isready工具,足以满足集成测试需求。如果测试涉及C扩展或需要与生产环境完全一致的glibc行为,则选择Debian变体。

官方镜像的关键环境变量:

  • POSTGRES_PASSWORD — 必填,设置超级用户密码
  • POSTGRES_USER — 可选,默认postgres
  • POSTGRES_DB — 可选,默认与POSTGRES_USER同名
  • POSTGRES_INITDB_ARGS — 可选,传递给initdb的额外参数,如 --data-checksums
  • POSTGRES_INITDB_WALDIR — 可选,指定WAL目录位置

初始化脚本机制:容器首次启动时,会按字母顺序执行 /docker-entrypoint-initdb.d/ 目录下的 .sql、.sql.gz 和 .sh 文件。这是预置测试表结构、模拟数据、扩展插件的标准入口。

PostgreSQL Mock测试环境启动流程 docker compose up -d 拉取 postgres:16-alpine 创建容器 + 挂载卷 执行 initdb + 初始化脚本 pg_isready 健康检查通过 关键说明 • 初始化脚本按字母序执行 • 健康检查失败则容器重启 • 数据卷可复用,避免重复初始化

上图展示了从执行 docker compose up -d 到数据库健康检查通过的完整启动链路。在Mock测试场景中,健康检查是自动化脚本等待数据库就绪的关键信号,建议在测试框架中轮询该状态后再执行DDL或数据插入操作。

2.4 验证环境就绪

完成上述配置后,执行以下命令验证整个环境是否正常工作:

# 启动环境
docker compose up -d

# 等待健康检查通过
sleep 3
docker compose ps

# 连接数据库并执行简单查询
docker compose exec -T postgres psql -U test_user -d test_db -c "SELECT version();"

如果输出显示PostgreSQL版本号(如 16.4),则说明环境准备成功。此时可以基于这个容器化PostgreSQL实例,开始构建Mock依赖隔离的集成测试框架。