Docker Compose 快速参考 - 最有用的命令及示例

顺便说一下,docker-compose 与 docker compose 是不同的……

目录

以下是 Docker Compose 快速参考 ,包含注释示例,帮助您快速掌握 Compose 文件和命令。

docker-compose schema

Compose 文件参考:docker-compose.yml

核心结构

version: '3'       # Compose 文件格式版本

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"   # 主机端口 8080:容器端口 80
  db:
    image: postgres
    environment:            # 环境变量
      POSTGRES_PASSWORD: example
    volumes:
      - db_data:/var/lib/postgresql/data

networks:          # 自定义网络
  appnet:
    driver: bridge

volumes:           # 命名卷
  db_data:
  • services:您多容器应用中的每个容器。在上面的例子中,我们有两个服务:webdb
  • networks & volumes:定义隔离网络和持久存储 - 我们在这里有 appnet 网络和 db_data 卷。

示例

单服务与端口映射

services:
  app:
    build: .
    ports:
      - "8000:80"   # 主机端口 8000:容器端口 80

在主机端口 8000 上暴露应用,并从当前目录中的 Dockerfile 构建。

多服务,共享卷和自定义网络

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - type: bind
        source: ./app
        target: /app
    networks:
      - mynet
  db:
    image: postgres
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - mynet

networks:
  mynet:

volumes:
  db_data:

Web 和 DB 在同一个网络上;DB 使用持久化命名卷 - db_data

使用构建上下文和 Dockerfile 路径

您可以根据在 docker-compose.yml 中指定的 Dockerfile 构建 docker 镜像

services:
  app:
    build:
      context: .
      dockerfile: docker/MyDockerfile

服务间共享数据

services:
  web:
    image: nginx
    volumes:
      - shared_data:/usr/share/nginx/html
  worker:
    image: myworker
    volumes:
      - shared_data:/usr/src/app/data

volumes:
  shared_data:

两个服务访问相同的卷(用于静态文件或数据交换)- shared_data

高级 Compose 文件选项

  • environment:为容器设置环境变量。
  • depends_on:控制服务启动顺序。
  • deploy.replicas:在 Swarm 模式下扩展服务。

示例:

services:
  web:
    image: nginx
    deploy:
      replicas: 3
    depends_on:
      - db

启动 3 个 web 实例;仅控制启动顺序(不控制就绪状态)。

Docker Compose 必备命令

命令 描述 示例用法
docker-compose up 创建并启动容器 docker-compose up
docker-compose up -d 在后台运行 docker-compose up -d
docker-compose exec 在运行的容器中执行命令 docker-compose exec web bash
docker-compose build 构建/重新构建镜像 docker-compose build
docker-compose down 停止并删除容器、网络、卷和镜像 docker-compose down
docker-compose logs -f 查看并跟踪日志 docker-compose logs -f
docker-compose ps 列出正在运行的容器 docker-compose ps
docker-compose run 运行一次性命令(绕过 Compose 文件中的命令) docker-compose run web python manage.py migrate
docker-compose stop 停止运行中的容器(可以使用 start 重新启动) docker-compose stop
docker-compose restart 重启服务 docker-compose restart web
docker-compose pull 拉取服务镜像 docker-compose pull
docker-compose rm 删除已停止的服务容器 docker-compose rm web
docker-compose config 验证并查看 Compose 文件 docker-compose config
docker-compose up --scale web=3 启动服务的多个实例 docker-compose up --scale web=3

常见 Compose 模式

  • 带有持久数据的数据库

    services:
      mysql:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: password
        volumes:
          - mysql_data:/var/lib/mysql
    
    volumes:
      mysql_data:
    

    DB 数据在 mysql_data 卷中持久化,即使容器重启也不会丢失。

  • 开发时绑定挂载代码

    services:
      app:
        build: .
        volumes:
          - .:/app
    

    在主机上实时编辑代码,自动反映在容器中。

有用的标志

  • -d:分离模式(在后台运行)。
  • --build:在启动前强制重新构建镜像。
  • --force-recreate:即使未更改,也重新创建容器。
  • --remove-orphans:删除 Compose 文件中未定义的容器。

定义和自定义服务

您可以通过利用 docker-compose.yml 文件来 定义和自定义服务、网络和卷,该文件集中了所有应用程序的配置和编排需求。

  • 服务services 键下定义。
  • 每个服务代表一个容器配置,您可以设置:
    • Image:从 Docker Hub 或其他注册表选择一个镜像。
    • Ports:将容器端口映射到主机端口。
    • Environment variables:传递配置值。
    • Volumes:持久化数据或与主机或其他服务共享文件/文件夹。
    • Networks:控制服务可以访问的网络。

示例:

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"   # 主机端口 8080:容器端口 80
    environment:
      - NGINX_HOST=localhost
    volumes:
      - web_data:/usr/share/nginx/html
    networks:
      - frontend

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: secret
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - backend
  • 在这里,web 服务使用了 nginx 镜像,设置了环境变量,挂载了卷,将容器的 80 端口映射到主机的 8080 端口,并连接到 frontend 网络。db 服务对 PostgreSQL 做了类似的操作。

自定义网络

  • 网络 控制哪些服务可以通信。Compose 会创建一个默认网络,但您可以定义更多,指定自定义驱动,设置选项,并确定哪个服务加入哪个网络以实现细粒度的隔离。
  • 在顶级的 networks 下定义网络,并在服务级别使用 networks 键列出服务应连接的网络。

示例:

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  • 将网络连接到服务:
services:
  app:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend
  • 此设置允许 app 服务访问 frontendbackend 网络上的用户,而 db 服务只能在 backend 网络上访问。

自定义卷

  • 在顶级的 volumes 键下定义。使用服务下的 volumes 键将它们挂载到容器中。
  • 卷可以命名,使用自定义驱动,并在多个服务之间共享以实现数据持久化和共享。

示例:

volumes:
  web_data:                # 用于网页内容的命名卷
  db_data:                 # 用于数据库的命名卷

services:
  web:
    volumes:
      - web_data:/usr/share/nginx/html

  db:
    volumes:
      - db_data:/var/lib/postgresql/data
  • 在这个示例中,web_data 被持久化,并且对任何挂载它的容器都可用。db_data 确保数据库数据在容器重新创建时不会丢失。
  • 您可以为高级情况定义带有自定义驱动选项的绑定挂载:
volumes:
  db_data:
    driver: local
    driver_opts:
      type: none
      device: /data/db_data
      o: bind
  • 此配置将主机路径 /data/db_data 绑定挂载到容器中。

最佳实践总结:

  • 使用服务名称作为 DNS 主机名进行服务间通信。
  • 根据需要将服务连接到多个网络以控制访问。
  • 使用命名卷进行持久存储和数据共享。
  • 使用 YAML 定义所有内容,实现版本控制和易于部署脚本。

多个 Compose 文件

为了 组织复杂的多服务设置,在 Docker Compose 中,您可以使用 多个 Compose 文件和覆盖文件,实现模块化、环境特定和可扩展的配置。以下是其工作方式:

  1. 基础和覆盖文件结构
  • 创建一个基础文件compose.yamldocker-compose.yml),其中包含所有通用的默认服务定义。
  • 添加环境特定的覆盖文件(例如,docker-compose.override.ymldocker-compose.dev.ymldocker-compose.prod.yml)。

示例文件结构:

/project-directory
|-- docker-compose.yml           # 基础配置
|-- docker-compose.override.yml  # 本地/开发覆盖(自动应用)
|-- docker-compose.prod.yml      # 生产覆盖
|-- docker-compose.test.yml      # 测试覆盖(如果需要)

基础配置定义核心服务,而每个覆盖文件为特定环境或情况自定义设置。

  1. 文件覆盖的工作方式
  • 合并: 当您运行 docker compose up 时,Docker Compose 会按照顺序合并基础文件和任何覆盖文件;后续文件会覆盖、扩展或添加前面文件中的设置。
  • 覆盖字段: 如果某个服务或字段在多个文件中定义,最后一个指定文件的值将被使用。新字段将被添加。

示例合并:

  • docker-compose.yml:
    services:
      web:
        image: myapp
        ports:
          - "8000:80"
    
  • docker-compose.override.yml:
    services:
      web:
        environment:
          - DEBUG=true
    
  • 结果: web 服务使用基础镜像和端口,以及覆盖的 DEBUG 环境变量。
  1. 多个文件的命令使用
  • 默认行为: 如果存在,Docker Compose 会自动加载 docker-compose.override.ymldocker-compose.yml 一起运行任何命令。
  • 手动指定文件: 使用 -f 标志控制合并哪些文件以及顺序:
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    
    • 这会忽略默认覆盖文件,使用生产特定的设置。
  1. 实用组织策略
  • 环境分离: 每个环境使用一个覆盖文件:开发、测试、生产等。
  • 微服务和团队: 将配置拆分为不同服务或团队的单独文件,并根据需要合并。
  • 功能切换: 额外文件可以引入或移除临时需求的可选服务或配置(例如,一个 compose.debug.yml 用于额外日志)。
  1. 优势
  • 清晰度: 保持单个文件小而专注。
  • 可扩展性: 轻松添加新服务、环境或设置。
  • 可维护性: 仅更改或审查特定部署的相关部分。
  1. 示例:切换环境

开发:

docker compose -f docker-compose.yml -f docker-compose.dev.yml up

生产:

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

每个环境仅获取其所需的配置,所有共享配置都在基础文件中。

使用多个文件组织复杂的 Compose 设置,并利用覆盖/合并系统,确保模块化、环境特定的自定义和大型多服务 Docker 应用程序的轻松扩展。

有用的链接