掌握 Docker Compose:开发人员实用指南🚀
想要使用 Docker Compose 改善开发工作流程?本指南涵盖了开发人员应该了解的所有内容 - 从基本设置到常见的故障排除模式。
**目录** 📋
什么是 Docker Compose?🐙
Docker Compose 可轻松同时运行多个容器。这是一款出色的本地开发和测试工具,不会弄乱您的机器。
Compose 允许您在单个文件“compose.yml”(旧版本为“docker-compose.yml”)中定义所有内容,并使用单个命令启动它们,而不必单独启动每个服务(例如数据库、后端和前端)。
基本设置📌
Docker Compose 模板
这是一个最小但实用的后端应用程序和数据库模板:
services:
backend:
build: ./backend
ports:
- "8000:8000"
environment:
- DB_HOST=database
- DB_USER=postgres
- DB_PASSWORD=secretpassword
depends_on:
# Waits for 'database' service to start
- database
volumes:
# Mounts local directory to container for live code updates
- ./backend:/app
database:
image: postgres:17
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=secretpassword
volumes:
# Persists data using named volume 'db_data'
- db_data:/var/lib/postgresql/data
volumes:
# Declares the named volume
db_data:**主要特点:**
配置优先级
Docker Compose 使用这个文件优先级:
1. compose.yml 2. compose.yaml 3. compose.override.yml 4. compose.override.yaml
**注意**:`docker-compose.yml` 多年来一直是标准名称。虽然仍然有效,但 Docker 现在在现代项目中默认使用 `compose.yml`。如果您使用的是较旧的环境或工具,`docker-compose.yml` 仍可无缝运行。
您可以使用覆盖文件进行特定于开发设置:
# compose.yml (base configuration)
services:
backend:
build: ./backend
environment:
- NODE_ENV=production
# compose.override.yml (development overrides)
services:
backend:
environment:
- NODE_ENV=development
volumes:
- ./backend:/app忽略覆盖:
docker compose -f compose.yml up -d
基本命令💡
基本操作
# Start services docker compose up -d # Detached mode docker compose up --build # Rebuild images # Stop services docker compose stop # Stops running containers without removing them. docker compose down # Stops and removes containers and networks.
常见任务
开发过程中常用的命令:
# Check running services docker compose ps # View service logs for all services docker compose logs -f # Restart a single service (for quick iterations) docker compose restart backend
清洁服务
保持环境清洁至关重要。以下是管理未使用的资源和容器的关键命令:
**用法:**
构建和启动服务
以下是构建镜像和启动容器的常用命令的快速参考:
**用法:**
使用容器
您可以使用**服务名称**(推荐用于`docker compose`)或**容器名称**(独立的`docker`命令)与容器交互:
使用 Docker Compose(服务名称)
在 `compose.yml` 中定义的服务名称使交互更加容易:
docker compose exec database bash # Access the container shell docker compose exec database psql -U postgres -d myapp # Connect to the PostgreSQL
注意:服务名称在“compose.yml”的“services”部分中定义。
使用 Docker 命令(容器名称)
使用 `docker ps` 中显示的容器名称进行手动交互:
docker exec -it myapp-db bash # Access the container shell docker exec -it myapp-db psql -U postgres -d myapp # Connect to PostgreSQL
注意:除非你手动设置“container_name”,否则 Docker 会自动生成名称(例如“database_1”)。在进行扩展时请避免这样做。
开发工作流程
根据更改类型使用以下命令:
docker compose restart backend
docker compose up --build backend
docker compose down -v # Stop and clean up everything docker compose up --build # Rebuild and restart all services
故障排除
端口分配错误
当你看到这样的错误时:
Error: Bind for 0.0.0.0:8000 failed: port is already allocated
这意味着本地端口8000已被使用。
**解决方案:**
lsof -i :8000
kill -9
ports: - "8080:8000" # Map local port 8080 to container port 8000
存储和资源错误
在构建或运行容器时,您可能会遇到以下常见错误:
Error: failed to solve: failed to copy files: userspace copy failed: write /var/lib/docker/***: no space left on device
这表明磁盘空间不足。
**解决方案:**
docker system prune -a
df -h
docker images -a | grep none | awk '{ print $3; }' | xargs docker rmidocker volume prune
如果问题仍然存在,请考虑扩大存储容量。
高级功能⚡
网络配置
定义自定义网络以实现服务之间的安全通信:
services:
backend:
networks:
- app-network
database:
networks:
- app-network
networks:
app-network:
driver: bridge提示:使用“docker network ls”和“docker network inspect”来排除网络问题。
健康检查
确保其他服务依赖它们之前已准备就绪:
services:
database:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5资源管理
控制资源使用以确保稳定的性能:
services:
backend:
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M结论
Docker Compose 一开始看起来很复杂,但理解这些基础知识将帮助您应对大多数情况。
祝您容器化愉快!🐳