Skip to content

02 · Docker 容器化

Docker 的核心价值是「环境一致性」:在你机器上能跑,在服务器上也能跑,在 CI 里也能跑。写 Dockerfile 不需要记指令,只需要描述你的应用。

生成 Dockerfile

帮我为这个 Next.js 14 项目写一个生产用的 Dockerfile:

- Node.js 20 + Alpine 基础镜像(镜像尽量小)
- 用 pnpm 安装依赖
- 构建输出到 standalone 模式(next.config.js 里有 output: 'standalone')
- 多阶段构建:deps → builder → runner
- runner 阶段不包含 devDependencies
- 暴露 3000 端口,启动命令 node server.js

我的 .env 变量不要打包进镜像,运行时通过环境变量注入。

生成 docker-compose.yml

本地开发和联调用:

帮我写一个 docker-compose.yml,包含以下服务:

1. web:前端 Next.js 应用(用上面的 Dockerfile 构建)
2. api:后端 Node.js API(镜像从 ./backend/Dockerfile 构建)
3. postgres:PostgreSQL 15,数据持久化到 ./data/postgres
4. redis:Redis 7,用于 session 存储

web 依赖 api,api 依赖 postgres 和 redis。

本地开发时 web 映射到 3000 端口,api 映射到 4000。

优化镜像大小

读我的 Dockerfile,分析哪些地方导致镜像体积偏大,
并给出优化建议:

[贴出 Dockerfile 内容]

目标:把镜像从现在的 800MB 压缩到 200MB 以内。

调试容器问题

我的 Docker 容器启动后立即退出,错误日志如下:

[贴出 docker logs 输出]

分析原因并告诉我怎么修复。

本地模拟生产环境

帮我写一个 Makefile,包含以下命令:

- make dev:本地开发模式(热重载)
- make build:构建生产镜像
- make up:用 docker-compose 启动所有服务
- make down:停止所有服务
- make logs:查看所有服务日志
- make shell-web:进入 web 容器的 shell

大齐 AI 课堂 · 程序员的 Agent 开发课