Featured image of post 使用 Docker 设置本地开发环境Featured image of post 使用 Docker 设置本地开发环境

使用 Docker 设置本地开发环境

使用 Docker 建立可靠的本地开发环境。减少环境差异并简化您的工作流程。

“它可以在我的机器上运行”是每个开发人员都熟知的一句话。 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.ymlDockerfile 提交到 Git。
  • .env (秘密)添加到 .gitignore 并将 .env.example 包含在存储库中。
  • Makefilenpm 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 一起管理多个服务,同时通过卷挂载保持热重载,可以让您两全其美。首先在一个小项目上尝试,然后扩展到团队的完整工作流程。