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 | 当前推荐,长期支持 |
postgres:16-alpine 或 postgres:17-alpine。Alpine变体体积小、启动快,且包含完整的psql客户端和pg_isready工具,足以满足集成测试需求。如果测试涉及C扩展或需要与生产环境完全一致的glibc行为,则选择Debian变体。
官方镜像的关键环境变量:
POSTGRES_PASSWORD— 必填,设置超级用户密码POSTGRES_USER— 可选,默认postgresPOSTGRES_DB— 可选,默认与POSTGRES_USER同名POSTGRES_INITDB_ARGS— 可选,传递给initdb的额外参数,如--data-checksumsPOSTGRES_INITDB_WALDIR— 可选,指定WAL目录位置
初始化脚本机制:容器首次启动时,会按字母顺序执行 /docker-entrypoint-initdb.d/ 目录下的 .sql、.sql.gz 和 .sh 文件。这是预置测试表结构、模拟数据、扩展插件的标准入口。
上图展示了从执行 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依赖隔离的集成测试框架。