主题
22 · Docker 与 Compose
目标:用多阶段构建打包 Go API,并用 Compose 一键拉起 API + MySQL + Redis。
前置:18 · 串烧项目 · 20 · go-redis · 建议穿插 linux/10 部署
官方:Docker Docs · Compose
1. 为何卡在 Redis 之后学 Docker
生产栈与 Redis 都需要可重复环境。
先会写代码,再用容器固定依赖版本,避免「我机器上能跑」。
2. Dockerfile(多阶段)
dockerfile
# build
FROM golang:1.22-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /out/server ./cmd/server
# run
FROM alpine:3.20
WORKDIR /app
RUN apk add --no-cache ca-certificates
COPY --from=build /out/server /app/server
COPY config.example.yaml /app/config.yaml
EXPOSE 8080
USER nobody
ENTRYPOINT ["/app/server"]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
要点:最终镜像不含编译器;CGO_ENABLED=0 静态链更省事(无 C 依赖时)。
3. Compose 最小栈
docker-compose.yml:
yaml
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: notes
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:7-alpine
ports:
- "6379:6379"
api:
build: .
ports:
- "8080:8080"
environment:
APP_MYSQL_DSN: "root:root@tcp(mysql:3306)/notes?parseTime=true&charset=utf8mb4"
APP_REDIS_ADDR: "redis:6379"
APP_JWT_SECRET: "dev-only-change-me"
depends_on:
- mysql
- redis
volumes:
mysql_data:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
注意:容器间主机名是服务名(mysql / redis),不是 127.0.0.1。
bash
docker compose up --build
curl http://127.0.0.1:8080/health1
2
2
4. 核心概念清单
| 概念 | 你要会的 |
|---|---|
| Image / Container | 构建一次,实例多次 |
| Volume | DB 数据持久化 |
| Network | Compose 默认网络互通 |
| 多阶段 | 缩小镜像、减攻击面 |
.dockerignore | 排除 .git、本地 config 密钥 |
5. 动手清单
- [ ] 多阶段镜像能
docker run起 API - [ ] Compose 起三件套;API 连上 MySQL 与 Redis
- [ ] 改代码后
--build生效 - [ ] README 写清:首次等待 MySQL ready(可简单 sleep 或 healthcheck)
- [ ] 密钥仅环境变量,不进镜像层
6. 项目驱动
| 目标 | 做法 |
|---|---|
| 新同学开箱 | docker compose up |
| 与 linux 教程衔接 | 云机装 Docker 后同 Compose |
| 为 K8s 铺路 | 先有镜像,32 篇再谈编排 |
7. 常见坑 + AI 审查
| 坑 | 说明 |
|---|---|
API 用 localhost:3306 连 Compose 里的 MySQL | 应写服务名 |
用 latest 无钉版本 | 学习可;记录已验证版本 |
| 镜像内 root 跑 + 带密钥文件 | 非 root;密钥运行时注入 |
| AI 生成巨型无关镜像 | 坚持 alpine/distroless 思路 |
8. 下一篇
异步解耦:
→ 23 · RabbitMQ 入门
完整后续目录见 11 · 路线图。
本篇验收:Compose 栈能支撑你继续往 MQ 走,而不再依赖「本机手装三件套」。
