开发工具

用Docker搭建本地开发环境:告别在我电脑上能跑

手把手教你用Docker搭建标准化本地开发环境,解决团队环境不一致问题,附常用开发环境Docker Compose配置。

#Docker #开发环境 #容器化 #Docker Compose

“在我电脑上能跑”的终结者

“在我电脑上能跑啊”——这句话可能是团队协作中最让人崩溃的一句。不同的系统版本、不同的依赖版本、不同的环境配置,都可能导致同样的代码在不同机器上表现不同。Docker就是来解决这个问题的。

Docker基础概念速览

概念说明类比
镜像(Image)应用的打包文件安装光盘
容器(Container)运行中的镜像实例运行中的虚拟机
Dockerfile构建镜像的脚本安装说明书
Docker Compose多容器编排工具系统集成方案
Volume数据持久化存储外接硬盘
Network容器间的网络通信局域网

常见开发环境的Docker配置

Node.js全栈开发环境

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgresql://postgres:password@db:5432/myapp
    depends_on:
      - db
      - redis
    command: npm run dev

  db:
    image: postgres:16-alpine
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: myapp
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

对应的Dockerfile:

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .

EXPOSE 3000

CMD ["npm", "run", "dev"]

Python Django开发环境

version: '3.8'

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://postgres:password@db:5432/django_app
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: django_app
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

  celery:
    build: .
    command: celery -A myproject worker -l info
    volumes:
      - .:/code
    depends_on:
      - db
      - redis

  redis:
    image: redis:7-alpine

volumes:
  postgres_data:

Docker开发环境的最佳实践

1. 善用Volume挂载

开发时一定要把源代码目录挂载进容器,这样修改代码后容器里也能实时更新,不需要重新构建镜像。

volumes:
  - .:/app          # 挂载源代码
  - /app/node_modules  # 排除node_modules

2. 使用多阶段构建

开发和生产用不同的构建阶段,减小生产镜像体积:

# 开发阶段
FROM node:20-alpine AS development
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["npm", "run", "dev"]

# 生产阶段
FROM node:20-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
RUN npm run build
CMD ["npm", "start"]

3. 环境变量管理

# .env文件
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your_secure_password
POSTGRES_DB=myapp
REDIS_URL=redis://redis:6379
# docker-compose.yml中引用
services:
  app:
    env_file:
      - .env

常见问题与解决方案

问题原因解决方案
容器启动慢镜像太大使用alpine镜像
文件同步慢(macOS)Docker Desktop的文件系统使用VirtioFS或新版Docker
端口冲突宿主机端口被占用修改映射端口
权限问题容器内外UID不一致指定用户或修改权限
磁盘空间不足镜像和容器积累定期执行docker system prune

macOS文件同步性能优化

如果你在macOS上开发,Docker的文件挂载性能一直是个痛点。以下是优化建议:

# 使用Docker Desktop的VirtioFS(推荐)
# Docker Desktop -> Settings -> General -> 选择VirtioFS

# 或者使用cached挂载模式
volumes:
  - .:/app:cached

实用Docker命令

# 启动开发环境
docker compose up -d

# 查看日志
docker compose logs -f app

# 进入容器Shell
docker compose exec app sh

# 重新构建镜像
docker compose build --no-cache

# 停止并清理
docker compose down -v

# 查看资源使用情况
docker stats

# 清理无用资源
docker system prune -a

VS Code Dev Containers

如果你用VS Code开发,强烈推荐Dev Containers插件。它能让你直接在容器内编辑代码,IntelliSense、调试等功能都正常工作。

创建.devcontainer/devcontainer.json

{
  "name": "Node.js Dev",
  "dockerComposeFile": "../docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/app",
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode"
      ]
    }
  }
}

什么时候不需要Docker

Docker不是银弹。以下场景可能不需要Docker:

  1. 简单的前端项目:一个npm install就能跑的项目没必要Docker化
  2. 学习和实验:快速尝试一个新技术时,直接本地安装更快
  3. 性能敏感的开发:某些场景下Docker的IO性能损耗会影响开发体验

对于Python开发环境,如果只是管理依赖版本,用虚拟环境可能就够了。Docker更适合需要多个服务配合的复杂项目。

总结

Docker让”在我电脑上能跑”这个问题彻底成为历史。花一两个小时写好Docker配置,就能让整个团队共享一致的开发环境。配合CI/CD工具使用,从开发到部署都能保持环境一致,极大减少环境相关的bug。