掌握 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 rmi
docker 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 一开始看起来很复杂,但理解这些基础知识将帮助您应对大多数情况。
祝您容器化愉快!🐳