掌握 Docker Compose:开发人员实用指南🚀

想要使用 Docker Compose 改善开发工作流程?本指南涵盖了开发人员应该了解的所有内容 - 从基本设置到常见的故障排除模式。

**目录** 📋

  • 什么是 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:

    **主要特点:**

  • depending_on:确保服务按顺序启动。
  • 卷:支持持久数据和实时代码更新。
  • 环境变量:连接的简单配置。
  • 配置优先级

    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

    清洁服务

    保持环境清洁至关重要。以下是管理未使用的资源和容器的关键命令:

    **用法:**

  • down -v:用于彻底清理,包括持久数据和卷。
  • down --remove-orphans:非常适合清除剩余或不相关的容器。
  • rm -f [service_name]:快速删除特定容器。
  • 系统修剪:定期维护以释放空间。
  • system prune -a:磁盘空间不足时进行深度清理。
  • 卷修剪:删除未使用的数据卷以回收空间。
  • 构建和启动服务

    以下是构建镜像和启动容器的常用命令的快速参考:

    **用法:**

  • up:当镜像已经构建时启动容器。
  • 构建:当 Dockerfile 或依赖项发生更改时重建图像。
  • up --build:一步重建并启动服务。适合快速迭代。
  • 使用容器

    您可以使用**服务名称**(推荐用于`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
  • Dockerfile 或依赖项更改:重建并重新启动。
  • 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已被使用。

    **解决方案:**

  • 1.检查端口使用情况:找到使用端口的进程:
  • lsof -i :8000
  • 2.终止进程:终止占用端口的进程:
  • kill -9 
  • 3. 更改端口:更新 compose.yml 以使用不同的本地端口:
  • 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

    这表明磁盘空间不足。

    **解决方案:**

  • 1.清理Docker系统:
  • docker system prune -a
  • 2.检查可用空间:
  • df -h
  • 3. 删除悬空图像:
  • docker images -a | grep none | awk '{ print $3; }' | xargs docker rmi
  • 4. 清理未使用的卷:
  • 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 一开始看起来很复杂,但理解这些基础知识将帮助您应对大多数情况。

  • 从简单的开始。
  • 使用正确的命令来完成任务。
  • 保持环境清洁。
  • 祝您容器化愉快!🐳