当前位置: 首页 > news >正文

【Docker基础】Compose 使用手册:场景、文件与命令详解

文章目录

  • 一、什么是 Docker Compose
  • 二、为什么需要 Docker Compose
  • 三、Docker Compose 使用步骤 / 核心功能
    • 步骤
    • 核心功能:
  • 四、Docker Compose 的使用场景
  • 五、Docker Compose 文件(docker-compose.yml)
    • 文件语法版本
    • 文件基本结构及常见指令
      • 常见字段格式语法
    • 示例:使用 `healthcheck` 配置容器健康检查
  • 六、Dockers Compose 命令清单
    • 常见 Docker Compose 命令 与 官方文档
      • 官方文档
    • 命令格式
    • 常见选项 / 命令
      • Docker Compose 常见命令及选项说明
    • 操作案例
  • 七、常见问题

一、什么是 Docker Compose

Docker Compose 是 Docker 官方的开源项目,使用 Python 编写,调用 Docker 服务的 API 来管理和编排容器。官方定义为:定义和运行多个 Docker 容器的应用。

在 Docker Compose 中,有两个重要概念:

  • 服务(Service):一个应用的容器,通常包括多个运行相同镜像的容器实例。
  • 项目(Project):由一组相关的应用容器组成的完整业务单元,在 docker-compose.yml 文件中定义。整个 docker-compose.yml 文件定义了一个项目。

Compose 的默认管理对象是 项目,通过子命令对项目中的一组容器进行简化的生命周期管理。

通过 compose 可以方便的管理多个服务。

在这里插入图片描述


二、为什么需要 Docker Compose

Docker 是一个轻量化的应用程序,官方推荐每个 Docker 容器只运行一个进程。

  • 如果一个应用需要 MySQL、Nginx 等环境,那么我们需要为应用、数据库和 Nginx 分别创建独立的 Docker 容器,并逐一启动它们。
  • 设想一下,构建好 Docker 后,每次启动应用都需要执行至少三次 docker run,或者编写脚本来实现,这会显得非常繁琐。
  • 此外,这些容器是分散独立的,不方便管理和维护镜像。既然这些容器都是为了同一个应用提供服务,那么将它们放在一起管理显得更为合理。这时,Docker Compose 就能帮助解决这类问题。

三、Docker Compose 使用步骤 / 核心功能

步骤

  1. 安装 Docker 和 Docker Compose
    确保已经安装了 Docker 和 Docker Compose。

  2. 创建 docker-compose.yml 文件
    在项目根目录下创建一个 docker-compose.yml 文件,定义服务、网络和卷等配置。

  3. 定义服务
    docker-compose.yml 中定义每个服务(容器),包括镜像、环境变量、端口映射等。

  4. 启动服务
    使用命令 docker-compose up 启动所有服务,-d 参数可以让容器在后台运行。

  5. 停止服务
    使用命令 docker-compose down 停止并删除所有容器。

  6. 查看日志
    使用 docker-compose logs 查看容器的日志输出。

核心功能:

  1. 多容器管理:可以轻松定义和管理多个服务(容器)。
  2. 一键启动与停止:通过命令启动或停止所有容器,简化操作。
  3. 服务依赖:自动处理服务之间的启动顺序。
  4. 配置管理:通过环境变量和 .env 文件管理配置。
  5. 数据持久化:支持使用卷(Volumes)持久化数据。
  6. 扩展服务:可以轻松扩展服务实例数量,处理负载。

四、Docker Compose 的使用场景

  1. 开发环境
    在开发过程中,Docker Compose 可以用来快速搭建多容器的开发环境,例如将数据库、缓存服务器、Web 应用等服务组合在一起,开发者可以通过一条命令启动或停止整个环境。

  2. 测试环境
    用于构建和管理临时的测试环境,确保不同服务之间的协作和集成测试在统一的环境中进行。可以确保每次测试时环境的一致性。

  3. 本地开发与调试
    在本地开发中,Docker Compose 允许开发者同时运行多个依赖服务(如数据库、消息队列等),无需手动启动每个容器,便于开发和调试。

  4. 微服务架构
    在微服务架构中,Docker Compose 可以用来管理多个微服务及其依赖服务(如数据库、API 网关等),通过 Compose 配置文件统一管理和部署。

  5. 多环境部署
    Docker Compose 支持为不同的环境(如开发、测试、生产)配置不同的服务和设置,帮助实现环境间的一致性和迁移。

  6. CI/CD 流水线
    在持续集成/持续部署(CI/CD)过程中,Docker Compose 可用于自动化构建、测试和部署多容器应用,简化流程,保证环境一致性。

  7. 本地模拟生产环境
    在本地机器上使用 Docker Compose 模拟生产环境中的复杂服务拓扑,帮助开发者在开发阶段提前发现潜在问题。


五、Docker Compose 文件(docker-compose.yml)

文件语法版本

目前,官方支持三大版本:Version 1、Version 2 和 Version 3,其中 Version 1 已被废弃。当前最新版本为 3.8,要求 Docker Engine 版本至少为 19.03.0。本课程将基于 3.8 版本的 Compose 文件语法进行讲解,其他版本的详细内容可以参考官方文档。

文件基本结构及常见指令

YAML 示例:

version: "3.8"  # 定义当前使用的 Docker Compose 语法版本
services:  # 服务定义,支持多个服务
  servicename:  # 服务名称,内部 bridge 网络中使用的 DNS 名称。非集群模式下相当于 Docker run 命令中的名称。
    image:  # 必选项,指定容器镜像
    command:  # 可选项,覆盖镜像的默认启动命令
    environment:  # 可选项,等同于 docker run 中的 --env 参数,用于设置环境变量
    volumes:  # 可选项,等同于 docker run 中的 -v 参数,用于数据卷挂载
    networks:  # 可选项,等同于 docker run 中的 --network 参数,指定容器网络
    ports:  # 可选项,等同于 docker run 中的 -p 参数,指定端口映射
    expose:  # 可选项,指定容器暴露的端口
    build:  # 可选项,指定构建镜像的路径
    depends_on:  # 可选项,定义服务间的依赖关系
    env_file:  # 可选项,定义外部环境变量文件

常见字段格式语法

  • image: 指定容器运行的镜像。支持多种格式:

    image: redis
    image: redis:5
    image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7
    image: library/redis
    image: my_private.registry:5000/redis
    
  • command: 覆盖容器启动时的默认命令:

    command: ["bundle", "exec", "thin", "-p", "3000"]
    command: bundle exec thin -p 3000
    
  • entrypoint: 覆盖容器的默认 entrypoint:

    entrypoint: /code/entrypoint.sh
    entrypoint:
      - php
      - -d
      - zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so
      - -d
      - memory_limit=-1
      - vendor/bin/phpunit
    
  • environment: 设置环境变量,可以使用数组或字典格式:

    environment:
      RACK_ENV: development
      SHOW: "true"
    

    或者数组格式:

    environment:
      - RACK_ENV=development
      - SHOW=true
    
  • networks: 配置容器使用的网络:

    services:
      frontend:
        image: awesome/webapp
        networks:
          - front-tier
          - back-tier
      monitoring:
        image: awesome/monitoring
        networks:
          - admin
      backend:
        image: awesome/backend
        networks:
          back-tier:
            aliases:
              - database
    
  • volumes: 将主机的数据卷或文件挂载到容器中:

    services:
      db:
        image: postgres:latest
        volumes:
          - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
          - "/localhost/data:/var/lib/postgresql/data"
    
  • ports: 配置端口映射:

    ports:
      - target: 80
        published: 8080
        host_ip: 127.0.0.1
        protocol: tcp
        mode: host
    
  • expose: 暴露容器内部端口,但不进行端口映射:

    expose:
      - "3000"
      - "8000"
    
  • build: 指定构建镜像的上下文路径:

    version: "3.7"
    services:
      webapp:
        build: ./dir
    
  • depends_on: 设置服务依赖关系,确保服务按顺序启动:

    services:
      web:
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis
      db:
        image: postgres
    

    可以根据服务健康状态设置条件:

    services:
      web:
        build: .
        depends_on:
          db:
            condition: service_healthy
          redis:
            condition: service_started
    
  • env_file: 从文件中加载环境变量,可以是多个文件:

    env_file:
      - .env
      - ./common.env
      - ./apps/web.env
      - /opt/secrets.env
    

示例:使用 healthcheck 配置容器健康检查

version: "3.8"
services:
  web:
    image: nginx:1.24.0
    environment:
      TEST: 1
    depends_on:
      mysql:
        condition: service_healthy
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: "bit@123"
    volumes:
      - /data/maxhou/mysqldata/varlib/:/var/lib/mysql
    healthcheck:
      test: mysql --user=root --password='bit@123' -e "SELECT 1;"
      interval: 10s
      timeout: 5s
      retries: 10

六、Dockers Compose 命令清单

常见 Docker Compose 命令 与 官方文档

  1. 启动和管理服务

    • docker-compose up:构建、(重新)创建、启动和附加到容器。
    • docker-compose down:停止并移除容器、网络和卷。
    • docker-compose start:启动已创建的容器。
    • docker-compose stop:停止容器。
    • docker-compose restart:重新启动服务容器。
  2. 构建和镜像管理

    • docker-compose build:构建或重新构建服务的镜像。
    • docker-compose push:将构建的镜像推送到 Docker 注册表。
  3. 容器状态和日志

    • docker-compose ps:列出服务的容器状态。
    • docker-compose logs:查看容器的输出日志。
    • docker-compose exec:在运行中的容器内执行命令。
    • docker-compose run:启动一个新容器并运行一次命令。
  4. 容器的其他操作

    • docker-compose exec:在运行中的容器中执行命令。
    • docker-compose run:运行一个一次性的容器实例。
    • docker-compose config:验证并查看 Compose 文件的配置。
    • docker-compose top:列出正在运行的容器的进程信息。
  5. 资源管理

    • docker-compose scale:设置服务的容器数量(只适用于 Version 2 格式)。

官方文档

Docker Compose 的官方文档包含完整的命令清单、配置项说明以及示例,可以通过以下链接访问:

  • Docker Compose 命令文档:https://docs.docker.com/compose/reference/

该页面提供了所有 docker-compose 命令的详细说明,包括常用命令、选项和用法示例。

命令格式

对于 Docker Compose,大多数命令可以作用于整个项目,也可以针对项目中的特定服务或容器。如果没有特别说明,命令默认会影响整个项目,即项目中的所有服务。

docker compose 命令的基本格式为:

docker compose [OPTIONS] COMMAND [ARGS...]

常见选项说明:

  • -f, --file:指定 Compose 模板文件,默认为 docker-compose.yml,可使用多个文件。
  • -p, --project-name:指定项目名称,默认使用当前目录名称作为项目名。

常见选项 / 命令

常见选项

  • -f --file 指定使用的Compose模板文件,默认为 docker-compose.yml,可以多次指定
  • -p, --project-name 指定项目名称,默认使用“所在目录的名称”作为项目名

常见命令

Docker Compose 常见命令及选项说明

1. up
该命令会自动完成包括构建镜像、(重新)创建服务、启动服务并关联相关容器等操作,通常用于启动一个项目。

基本命令格式

docker compose up [OPTIONS] [SERVICE...]

常见选项

  • -d:在后台运行服务容器,推荐在生产环境中使用该选项。
  • --force-recreate:强制重新创建容器,不能与 --no-recreate 同时使用。
  • --no-recreate:如果容器已存在,则不重新创建,不能与 --force-recreate 同时使用。

2. down
停止所有容器,并删除容器和网络。

基本命令格式

docker compose down [OPTIONS] [SERVICE...]

常见选项

  • -v, --volumes:删除容器的同时删除与容器关联的卷(目录映射)。

3. run
在指定服务容器上执行相关命令。此命令用于启动服务容器并在其中执行命令。

基本命令格式

docker compose run [OPTIONS] SERVICE [COMMAND] [ARGS...]

常见选项

  • -d:后台运行容器。
  • --name NAME:为容器指定一个名称。
  • --entrypoint CMD:覆盖容器的默认启动命令。
  • -e KEY=VAL:设置环境变量,支持多次使用来设置多个环境变量。
  • -u, --user="":指定运行容器的用户名或 UID。
  • --rm:运行命令后自动删除容器。
  • -p, --publish=[]:映射容器端口到本地主机。

示例

# 启动 ubuntu 服务容器,并执行 ping docker.com 命令
docker compose run ubuntu ping docker.com

下面是一个基本的 Docker Compose 操作案例,假设你的操作环境是 Ubuntu。

操作案例

下面演示如何创建一个包含 NginxMySQL 的多容器应用,并通过 docker-compose.yml 文件管理它们。我们可以根据需要扩展服务、配置网络和卷等。

1. 安装 Docker 和 Docker Compose

首先确保你的 Ubuntu 系统已经安装了 Docker 和 Docker Compose。你可以使用以下命令进行安装。

  1. 更新你的包列表并安装依赖:

    sudo apt update
    sudo apt install apt-transport-https ca-certificates curl software-properties-common
    
  2. 安装 Docker:

    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    
  3. 安装 Docker Compose:

    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    
  4. 验证安装:

    docker --version
    docker-compose --version
    
  5. 创建 Docker Compose 项目文件

假设我们要创建一个简单的项目,包含一个 Nginx 服务和一个 MySQL 数据库服务。

  1. 创建一个新目录

    mkdir myproject
    cd myproject
    
  2. 创建 docker-compose.yml 文件
    使用编辑器创建 docker-compose.yml 文件,该文件描述了我们的服务和配置。

    version: '3'
    
    services:
      web:
        image: nginx:latest
        container_name: nginx-container
        ports:
          - "8080:80"
        volumes:
          - ./html:/usr/share/nginx/html
        networks:
          - mynetwork
    
      db:
        image: mysql:5.7
        container_name: mysql-container
        environment:
          MYSQL_ROOT_PASSWORD: examplepassword
          MYSQL_DATABASE: exampledb
        volumes:
          - mysql-data:/var/lib/mysql
        networks:
          - mynetwork
    
    networks:
      mynetwork:
    
    volumes:
      mysql-data:
    

解释:

  • web 服务:使用 Nginx 镜像,映射本地的 8080 端口到容器的 80 端口。
  • db 服务:使用 MySQL 5.7 镜像,设置了数据库根密码 examplepassword 和数据库名 exampledb
  • 我们创建了一个网络 mynetwork 来让容器间通信,并为 MySQL 创建了一个数据卷 mysql-data 来持久化数据库数据。
  1. 创建 HTML 文件(可选)
    如果你希望在浏览器中访问你的 Nginx 服务并显示内容,可以创建一个简单的 HTML 文件:
    mkdir html
    echo "<h1>Hello from Docker Compose!</h1>" > html/index.html
    

3. 启动服务

在项目目录中,使用 docker compose up 命令来启动所有定义的服务。

docker compose up

如果你希望在后台运行容器,可以加上 -d 参数:

docker compose up -d

这个命令会:

  • 下载 nginxmysql 镜像(如果尚未下载)。
  • 创建并启动容器。
  • 自动创建网络 mynetwork 和卷 mysql-data

你可以用 docker ps 查看正在运行的容器:

docker ps

4. 访问 Nginx 服务

如果一切正常,你可以在浏览器中访问 Nginx 服务,打开 http://localhost:8080,你应该能够看到 “Hello from Docker Compose!” 的 HTML 内容。

  1. 查看容器日志

如果你想查看容器的日志,使用 docker compose logs 命令:

docker compose logs web

这将显示 Nginx 容器的日志。如果你想查看 MySQL 容器的日志,可以使用:

docker compose logs db
  1. 停止并删除服务

要停止并删除所有运行中的服务和容器,可以使用 docker compose down 命令:

docker compose down

如果你希望同时删除卷(例如 MySQL 的数据卷),可以使用 -v 选项:

docker compose down -v

七、常见问题

  1. uprunstart 之间的区别

    • docker-compose up:用于启动或重新启动通过 docker-compose.yml 文件定义的所有服务。在默认模式下,会显示所有容器的日志。在“分离模式”(-d)下,容器会在后台启动,Compose 命令会退出,但容器继续运行。

    • docker-compose run:用于运行“一次性”或“临时”任务,只会启动指定服务及其依赖的服务。常用于执行测试或管理任务,如从数据卷容器中删除或添加数据。run 命令类似于 docker run -ti,启动容器并进入交互式终端,执行完后根据进程的退出状态返回退出代码。

    • docker-compose start:用于重新启动已存在但停止的容器。不会创建新容器,只会启动已存在的、被停止的服务容器。

  2. 如何在同一主机上运行 Compose 文件的多个副本

    Compose 使用项目名称为项目中的所有容器和资源创建唯一标识符。要运行项目的多个副本,可以通过以下方式设置自定义项目名称:

    • 使用 -p 命令行选项来指定项目名称。
    • 使用 COMPOSE_PROJECT_NAME 环境变量来设置项目名称。

    这样可以在同一主机上启动多个独立的 Compose 项目实例。

  3. 可以控制服务启动顺序吗?

    可以通过在 docker-compose.yml 文件中使用 depends_on 来指定服务的启动顺序。可以结合 healthcheck 功能来确保服务在健康检查成功后再启动,从而实现更精确的启动控制。

相关文章:

  • 数据结构第五版【李春葆】
  • AWS出海合规解决方案:全球业务扩张的技术指南
  • 深度学习理论-直观理解 Attention
  • 【语音识别】vLLM 部署 Whisper 语音识别模型指南
  • 理解 MCP 协议的数据传递:HTTP 之上的一层“壳子
  • Spring State Machine入门实践
  • 算法思想之位运算(二)
  • C语言编写的线程池
  • 【Mybatis-plus】应用笔记及用例(持续更新)
  • esp32-idf Linux 环境安装教程
  • 【Code】《代码整洁之道》笔记-Chapter9-单元测试
  • 《Vue Router实战教程》1.设置
  • c#和form实现WebSocket在线聊天室
  • MATLAB求和∑怎么用?
  • CAP 定理与 BASE 定理在 .NET Core 中的应用
  • 操作系统学习笔记——进程间通信方式详解及优缺点对比,僵尸进程,孤儿进程,守护进程
  • 抗干扰CAN总线通信技术在分布式电力系统中的应用
  • 科技自立+产业周期:透视人工智能的配置机遇
  • RTP Payload Format for H.264 Vide(1)
  • Java Lambda 表达式详解:发展史、语法、使用场景及代码示例
  • 五一假期多地政府食堂对外开放:部分机关食堂饭菜“秒没”
  • 据报特斯拉寻找新CEO,马斯克财报会议上表态:把更多时间投入特斯拉
  • 人民日报钟声:国际社会应共同维护科学溯源的正确方向
  • 黄宾虹诞辰160周年|一次宾翁精品的大集结
  • 中使馆:奉劝菲方有关人士不要在台湾问题上挑衅,玩火者必自焚
  • 北大深圳研究生院成立科学智能学院:培养交叉复合型人才