“它可以在我的机器上运行”是每个开发人员都熟知的一句话。 Docker 通过将应用程序及其依赖项打包到可移植容器中来解决这个问题。本文逐步介绍如何使用 Docker 设置本地开发环境。
三个核心概念
- Dockerfile:容器的蓝图 - 使用哪个基础映像以及安装什么。
- docker-compose.yml:用于一起管理多个容器(Web 服务器、数据库、缓存等)的配置文件。
- 卷安装:让容器引用主机上的文件。热重载必不可少。
使用 docker-compose 设置多服务
典型的前端+后端+数据库设置可以在单个 docker-compose.yml 中定义:
version: "3.9"
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
volumes:
- ./frontend:/app
- /app/node_modules
command: npm run dev
backend:
build: ./backend
ports:
- "8000:8000"
volumes:
- ./backend:/app
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/app
db:
image: postgres:16
ports:
- "5432:5432"
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
要点
- 卷安装就像
./frontend:/app将主机源代码同步到容器中。主机上的更改会立即反映在容器内,从而保持热重载正常运行。 node_modules的匿名卷:/app/node_modules条目会阻止与主机同步,从而避免 Windows 和 Linux 之间的本机模块兼容性问题。- 环境变量:通过
environment块传递数据库连接字符串等配置。
开发友好的 Dockerfile
维护一个单独的 Dockerfile 进行开发是常见的做法:
FROM node:20-alpine
WORKDIR /app
# Install dependencies first (leverage layer caching)
COPY package*.json ./
RUN npm install
# Source code is volume-mounted, so no COPY needed
CMD ["npm", "run", "dev"]
诀窍是不要将 COPY 源代码放入图像中。相反,通过 docker-compose.yml 中的 volumes 挂载主机目录。这样,代码更改立即生效,无需重建容器。
团队一致性
Docker 在本地开发中的真正价值在于每个人都运行相同的环境。一些团队规则大有帮助:
- 将
docker-compose.yml和Dockerfile提交到 Git。 - 将
.env(秘密)添加到.gitignore并将.env.example包含在存储库中。 - 在
Makefile或npm scripts中提供包装器命令,以便不熟悉 Docker 的团队成员可以轻松上手。
up:
docker compose up -d
down:
docker compose down
build:
docker compose build
logs:
docker compose logs -f
常见陷阱
- 性能:文件安装在 Windows 上可能会很慢,尤其是在没有 WSL2 的情况下。在 WSL2 上运行 Docker Desktop 或考虑 Mutagen 等同步工具。
- 端口冲突:如果多个项目使用相同的端口(例如 3000),请更改
ports配置中的主机端端口(例如"3001:3000")。 - 卷清理:过时的卷会随着时间的推移而积累。运行
docker compose down -v来清理它们。
摘要
Docker 对本地开发的最大胜利是可重复性和团队一致性。使用 docker-compose 一起管理多个服务,同时通过卷挂载保持热重载,可以让您两全其美。首先在一个小项目上尝试,然后扩展到团队的完整工作流程。

