Skip to content

练习 — Docker 与 docker-compose

对应知识点:Docker · docker-compose · 多服务编排 对应文档:docs/phase-07-engineering/docker-compose.md 代码目录:workspace/phase-07/docker-compose/

前置条件:安装 Docker Desktop 或 Docker Engine + Compose。


Level 1 — 基础

练习 1.1 · 编写 Dockerfile

workspace/phase-07/docker-compose/ 为 Go API 编写多阶段 Dockerfile:

要求

  • 构建阶段:golang:1.22-alpinego build -o server ./cmd/server
  • 运行阶段:alpinedistroless,只复制二进制
  • 暴露 8080,CMD 启动 server
  • .dockerignore 排除 .gitworkspace 无关目录

练习 1.2 · 构建与运行

要求

  • docker build -t twin-api:dev .
  • docker run -p 8080:8080 twin-api:dev
  • curl 验证 /health

练习 1.3 · 环境变量注入

要求

  • Dockerfile 不硬编码 secret
  • docker run -e DATABASE_URL=... -e REDIS_ADDR=... 传入配置
  • 文档说明 12-factor 配置原则

Level 2 — 应用

练习 2.1 · docker-compose 双服务

创建 docker-compose.yml

要求

  • 服务:app(Go API)、postgres(postgres:16)
  • app 依赖 postgres,depends_on + healthcheck
  • 卷持久化 postgres 数据
  • 网络内 app 通过服务名 postgres:5432 连接

练习 2.2 · 加入 Redis

要求

  • 新增 redis:7 服务
  • app 环境变量 REDIS_ADDR=redis:6379
  • 三台服务同一 compose 网络

练习 2.3 · 初始化 SQL

要求

  • 挂载 ./migrations:/docker-entrypoint-initdb.d
  • postgres 首次启动自动执行 schema.sql
  • 文档说明 init 脚本仅首次生效

Level 3 — 综合

练习 3.1 · 开发 vs 生产 compose

要求

  • docker-compose.yml — 开发(挂载源码热重载可选,或 rebuild)
  • docker-compose.prod.yml — 生产(资源限制、restart policy)
  • docker compose -f docker-compose.yml -f docker-compose.prod.yml up

练习 3.2 · 健康检查

要求

  • app 服务 healthcheck:curl -f http://localhost:8080/health
  • postgres:pg_isready
  • redis:redis-cli ping
  • depends_on 使用 condition: service_healthy(Compose v2 语法)

Level 4 — 项目实践

练习 4.1 · Project 03 完整 compose 栈

workspace/phase-07/docker-compose/ 编排数字孪生后端:

服务

  • api — Go REST + WebSocket
  • postgres — 持久化
  • redis — 缓存 / Pub/Sub
  • nginx(可选)— 反向代理占位

要求

  • 一条命令 docker compose up --build 启动全栈
  • .env.example 列出所有变量
  • README:本地开发流程、常用命令、端口表
  • 验证:REST API + Redis 缓存 + WS 连接(可与 Phase 06 代码合并)

学习检查

  • [ ] 多阶段构建的优势?
  • [ ] depends_on 是否等待服务就绪?
  • [ ] 容器内 localhost 与宿主机 localhost 的区别?
  • [ ] 数据卷 vs bind mount 的使用场景?

提交方式

检查答案 — docker compose 练习 X.X

学习导航

上一篇:测试与性能基准 · 对应知识文档 · 下一篇:Linux 运维基础