开发工具
用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:
- 简单的前端项目:一个
npm install就能跑的项目没必要Docker化 - 学习和实验:快速尝试一个新技术时,直接本地安装更快
- 性能敏感的开发:某些场景下Docker的IO性能损耗会影响开发体验
对于Python开发环境,如果只是管理依赖版本,用虚拟环境可能就够了。Docker更适合需要多个服务配合的复杂项目。
总结
Docker让”在我电脑上能跑”这个问题彻底成为历史。花一两个小时写好Docker配置,就能让整个团队共享一致的开发环境。配合CI/CD工具使用,从开发到部署都能保持环境一致,极大减少环境相关的bug。