【容器编排工具Docker Compose】

8.1 Docker Compose 概述

Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个 project,即 项目 ),例如一个 Web 服务容器再加上后端的数据库服务容器等。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。

其是官方的一个开源项目,托管到github上

https://github.com/docker/compose

网址:

1 主要功能

  1. 定义服务
    • 使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、环境变量、存储卷等参数。
    • 例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。
  2. 一键启动和停止
    • 通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器应用的部署和管理过程。
    • 例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 docker-compose down 命令可以停止并删除这些服务。
  3. 服务编排
    • 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库服务必须在 Web 服务之前启动。
    • 支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的容器连接到这个网络上。
  4. 环境变量管理
    • 可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、测试和生产环境)中使用不同的配置变得更加容易。
    • 例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。

2. 工作原理

  1. 读取配置文件
    • Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。
  2. 创建容器
    • 根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需的镜像(如果本地没有),并设置容器的各种参数。
  3. 管理容器生命周期
    • Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。
    • 它还可以处理容器的故障恢复,例如自动重启失败的容器。

3. Docker Compose 中的管理层

  1. 服务 (service) 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  2. 项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义
  3. 容器(container)容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义的镜像创建的运行实例

4. Docker Compose配置常用字段

字段 描述
build 指定 Dockerfile 文件名,需在子级标签 dockerfile 中指定具体文件
dockerfile 构建镜像的 Dockerfile 文件名
context 构建上下文路径,可为本地路径或 Git 仓库 URL
image 指定服务使用的镜像
command 覆盖容器启动后默认执行的命令
container_name 指定唯一容器名称;指定后无法使用 scale 扩缩容
deploy 部署与运行服务的配置,仅在 Swarm 模式下生效
environment 添加环境变量(支持数组或键值对格式)
networks 加入自定义网络,引用顶级 networks 下的网络名称
network_mode 设置容器网络模式(如 hostbridgenone 等)
ports 暴露容器端口(格式:主机端口:容器端口),与 -p 等效
volumes 挂载宿主机目录或命名卷到容器;命名卷需在顶级 volumes 中先定义
volumes_from 从其他服务/容器挂载卷,支持 :ro(只读)或 :rw(读写),仅 v2 支持
hostname 设置容器主机名
sysctls 在容器内设置内核参数
links 连接到其他容器(格式:服务名称[:服务别名]),v3 版本不推荐使用
privileged 赋予容器宿主机 root 权限(true/false),存在安全风险
restart 容器重启策略:no(默认)、on-failureon-failure:Nalwaysunless-stopped
depends_on 控制容器启动顺序(不保证服务就绪状态)

5. 关键说明

  • restart 策略

    • no:容器退出时不重启
    • on-failure:非正常退出(状态码≠0)时重启
    • on-failure:N:非正常退出时重启,最多 N 次
    • always:容器退出时总是重启
    • unless-stopped:容器退出时总是重启,但不包含 Docker 守护进程启动时已停止的容器
  • depends_on

    仅保证容器启动顺序(如先启动数据库再启动应用),不保证依赖服务完全就绪。

8.2 Docker Compose 的常用命令参数

build 字段

指定 Dockerfile 文件名,用于构建镜像。若需自定义 Dockerfile 名称,需在 build 的子级标签中使用 dockerfile 标签明确指定。

dockerfile 字段

定义构建镜像的上下文路径。可以是 Dockerfile 的本地路径,或指向 Git 仓库的 URL 地址。

context 字段

指定构建上下文路径。通常为包含 Dockerfile 的目录路径,或远程 Git 仓库地址。

image 字段

直接指定使用的镜像名称或 ID,跳过构建步骤。适用于直接拉取现有镜像的场景。

command 字段

覆盖容器启动后默认执行的命令。允许自定义容器启动时的运行指令。

container_name 字段

为容器指定唯一名称。若自定义名称,则无法通过 scale 扩展容器数量。

deploy 字段

配置服务的部署和运行参数,仅在 Swarm 模式下生效。用于定义副本数、资源限制等。

environment 字段

设置容器内的环境变量。支持键值对形式,如 KEY=value

networks 字段

将服务连接到顶级 networks 中定义的网络。允许多个服务共享同一网络。

network_mode 字段

设置容器的网络模式,如 hostbridgenone 等。影响容器的网络隔离性。

ports 字段

暴露容器端口到宿主机,格式为 宿主机端口:容器端口。注意端口号需大于等于 60。

volumes 字段

挂载宿主机目录或命名卷到容器。命名卷需在顶级 volumes 中预先定义。

volumes_from 字段

从其他服务或容器挂载卷。支持只读(:ro)或读写(:rw)模式,仅限版本 '2'。

hostname 字段

设置容器的主机名。默认为容器 ID,可通过此字段自定义。

sysctls 字段

配置容器内的内核参数。需以键值对形式指定,如 net.core.somaxconn=1024

连接到其他容器。格式为 服务名称:服务别名,用于服务间通信。

privileged 字段

赋予容器 root 权限。设置为 true 时容器拥有宿主机内核权限,存在安全隐患。

复制代码
services:
  web:
    image: nginx
    ports:
      - "80:80"

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: lee

8.3 Docker Compose 常用命令:

1. 服务管理

1. docker-compose up

  • 启动配置文件中定义的所有服务。

  • 可以使用 -d 参数在后台启动服务。

  • 可以使用-f 来指定yml文件

  • 例如:docker-compose up -d

  • bash 复制代码
    [root@docker test]# docker compose up -d
    [+] Running 2/2
     ✔ Container test-db-1   Started            0.9s
     ✔ Container test-web-1  Started            0.9s
     
    [root@docker ~]# docker compose -f  test/docker-compose.yml  up -d
    [+] Running 3/3
     ✔ Network test_default  Created             0.1s
     ✔ Container test-web-1  Started             0.9s
     ✔ Container test-db-1   Started   

2. docker-compose down

  • 停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。
bash 复制代码
[root@docker test]# docker compose down

3. docker-compose start

  • 启动已经存在的服务,但不会创建新的服务。

    bash 复制代码
    [root@docker test]# docker compose start
    [+] Running 2/2
     ✔ Container test-db-1   Started                                                                 
     ✔ Container test-web-1  Started   

4. docker-compose stop

  • 停止正在运行的服务

    bash 复制代码
    [root@docker test]# docker compose stop
    [+] Stopping 2/2
     ✔ Container test-web-1  Stopped                                                          0.4s
     ✔ Container test-db-1   Stopped                                                         10.3s

5. docker-compose restart

  • 重启服务。

    bash 复制代码
    [root@docker test]# docker compose restart
    [+] Restarting 2/2
     ✔ Container test-web-1  Started                                                                     
     ✔ Container test-db-1   Started  

2. 服务状态查看

1. docker-compose ps

  • 列出正在运行的服务以及它们的状态,包括容器 ID、名称、端口映射等信息。

    复制代码
    [root@docker test]# docker compose ps
    NAME         IMAGE       COMMAND                   SERVICE   CREATED         STATUS          PORTS
    test-db-1    mysql:5.7   "docker-entrypoint.s..."   db        2 minutes ago   Up 48 seconds   3306/tcp, 33060/tcp
    test-web-1   nginx       "/docker-entrypoint...."   web       2 minutes ago   Up 50 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp

2. docker-compose logs

  • 查看服务的日志输出。可以指定服务名称来查看特定服务的日志。

    复制代码
    [root@docker test]# docker compose  logs db

3、其他操作

1. docker-compose exec

  • 在正在运行的服务容器中执行命令。

    复制代码
    services:
      test:
        image: busybox
        command: ["/bin/sh","-c","sleep 3000"]
        restart: always
        container_name: busybox1
    
    [root@docker test]# docker compose -f test.yml  up -d
    [root@docker test]# docker compose  -f test.yml  exec  test sh
    / #

2. docker-compose pull

  • 拉取配置文件中定义的服务所使用的镜像。

    [root@docker test]# docker compose -f test.yml pull
    [+] Pulling 2/2
    ✔ test Pulled
    ✔ ec562eabd705 Pull complete

3. docker-compose config

  • 验证并查看解析后的 Compose 文件内容

    复制代码
    [root@docker test]# docker compose -f test.yml  config
    name: test
    services:
      test:
        command:
          - /bin/sh
          - -c
          - sleep 3000
        container_name: busybox1
        image: busybox
        networks:
          default: null
        restart: always
    networks:
      default:
        name: test_default
    [root@docker test]# docker compose -f test.yml  config -q

8.4 Docker Compose 的yml文件

1, YAML 语言是什么

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。

2, 使用 YAML 时需要注意下面事项

●大小写敏感

●通过缩进表示层级关系

●不支持制表符 tab 键缩进,只能使用空格缩进

●缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格

●用 # 号注释

●符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -

●如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思

name: "Hi,\nTom"

3, 数据结构

3.1 对象映射: 键值对的字典

animal: pets (注意有空格)

3.2 序列数组: 一组按次序排列的列表

  • Cat
  • Dog
  • Goldfish

"Cat", "Dog", "Goldfish"\] 这是第二种写法 #### 3.3 布尔值 debug: true debug: false Docker Compose 的 YAML 文件用于定义和配置多容器应用程序的各个服务。以下是一个基本的 Docker Compose YAML 文件结构及内容解释: ### **一、服务(services)** #### 1. **服务名称(service1_name/service2_name 等)**: * 每个服务在配置文件中都有一个唯一的名称,用于在命令行和其他部分引用该服务。 services: web: # 服务1的配置 mysql: # 服务2的配置 #### 2. **镜像(image)**: * 指定服务所使用的 Docker 镜像名称和标签。例如,`image: nginx:latest` 表示使用 `nginx` 镜像的最新版本 services: web: images:nginx mysql: images:mysql:5.7 #### 3. **端口映射(ports)**: * 将容器内部的端口映射到主机的端口,以便外部可以访问容器内的服务。例如,`- "8080:80"` 表示将主机的 8080 端口映射到容器内部的 80 端口。 ```bash services: web: image: timinglee/mario container_name: game #指定容器名称 restart: always #docekr容器自动启动 expose: - 1234 #指定容器暴露那些端口,些端口仅对链接的服务可见,不会映射到主机的端口 ports: - "80:8080" ``` #### 4. **环境变量(environment)**: * 为容器设置环境变量,可以在容器内部的应用程序中使用。例如,`VAR1: value1` 设置环境变量 `VAR1` 的值为 `value1` services: web: images:mysql:5.7 environment: MYSQL_ROOT_PASSWORD: lee #### 5. **存储卷(volumes)**: * 将主机上的目录或文件挂载到容器中,以实现数据持久化或共享。例如,`- /host/data:/container/data` 将主机上的 `/host/data` 目录挂载到容器内的 `/container/data` 路径。 services: test: image: busybox command: ["/bin/sh","-c","sleep 3000"] restart: always container_name: busybox1 volumes: - /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置 #### 6. **网络(networks)**: * 将服务连接到特定的网络,以便不同服务的容器可以相互通信 services: web: image: nginx container_name: webserver network_mode: bridge #使用本机自带bridge网络 services: test: image: busybox container_name: webserver command: ["/bin/sh","-c","sleep10000000"] #network_mode: mynet2 networks: - mynet1 - mynet2 networks: mynet1: driver: bridge mynet2: driver: bridge #### 7. **命令(command)**: * 覆盖容器启动时默认执行的命令。例如,`command: python app.py` 指定容器启动时运行 `python app.py` 命令 [root@docker test]# vim busybox.yml services: web: image: busybox container_name: busybox #network_mode: mynet2 command: ["/bin/sh","-c","sleep10000000"] ### **二、网络(networks)** * 定义 Docker Compose 应用程序中使用的网络。可以自定义网络名称和驱动程序等属性。 * 默认情况下docker compose 在执行时会自动建立网路 ```bash services: test: image: busybox1 command: ["/bin/sh","-c","sleep 3000"] restart: always network_mode: default container_name: busybox test1: image: busybox2 command: ["/bin/sh","-c","sleep 3000"] restart: always container_name: busybox1 networks: - mynet1 test3: image: busybox3 command: ["/bin/sh","-c","sleep 3000"] restart: always container_name: busybox1 networks: - mynet1 networks: mynet1: driver: bridge #使用桥接驱动,也可以使用macvlan用于跨主机连接 default: external: true #不建立新的网络而使用外部资源 name: bridge #指定外部资源网络名字 mynet2: ipam: driver: default config: - subnet: 172.28.0.0/16 gateway: 172.28.0.254 ``` #### **三、存储卷(volumes)** * 定义 Docker Compose 应用程序中使用的存储卷。可以自定义卷名称和存储位置等属性。 services: test: image: busybox command: ["/bin/sh","-c","sleep 3000"] restart: always container_name: busybox1 volumes: - data:/test #挂在data卷 - /etc/passwd:/tmp/passwd:ro #只读挂在本地文件到指定位置 volumes: data: name: timinglee #指定建立卷的名字 ## 8.5 企业示例 利用容器编排完成haproxy和nginx负载均衡架构实施 services: web1: image: nginx:latest container_name: web1 restart: always networks: - mynet1 expose: - 80 volumes: - /docker/web/html1:/usr/share/nginx/html web2: image: nginx:latest container_name: web2 restart: always networks: - mynet1 expose: - 80 volumes: - /docker/web/html2:/usr/share/nginx/html haproxy: image: haproxy:2.3 container_name: haproxy restart: always networks: - mynet1 - mynet2 volumes: - /docker/conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg ports: - 80:80 networks: mynet1: driver: bridge mynet2: driver: bridge ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9309714e27a942f2b7a28ad767c634e7.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/515987f51ed94d1eb0975d567a10c98f.png) ## 8.6Docker Compose(面试重点速记版) ### 一、核心定位(一句话概括) Docker Compose 是 Docker 官方的**多容器编排工具**,通过 YAML 文件定义多服务的运行配置(网络、数据卷、依赖、资源限制等),实现「一键启停/管理」多个关联容器,解决手动启动多容器时参数繁琐、依赖混乱的问题。 ### 二、核心概念(面试必记) | 概念 | 含义 | |-----------|----------------------------------------| | Project | 项目,对应一个 docker-compose.yml 文件,包含一组关联服务 | | Service | 服务,对应一个容器(可指定镜像/构建、端口、挂载、依赖等) | | Container | 容器,服务运行的实例,由 Compose 自动创建/管理 | ### 三、核心语法(高频配置,高度概括) ```yaml version: "3" # 版本(推荐3.x,兼容Docker最新特性) services: # 服务集合(核心) 服务名1: image: 镜像名:标签 # 镜像(优先) build: . # 无镜像时,基于当前目录Dockerfile构建 ports: ["主机端口:容器端口"] # 端口映射 volumes: ["卷名:容器路径"] # 数据卷挂载 environment: ["KEY=VALUE"] # 环境变量 depends_on: [服务名2] # 依赖(先启动服务名2) restart: always # 重启策略(always/on-failure/no) networks: [自定义网络] # 所属网络 networks: # 自定义网络(隔离/互联) 自定义网络: driver: bridge volumes: # 自定义数据卷(持久化) 卷名: ``` ### 四、核心命令(面试高频,记关键) | 命令 | 作用 | |------------------------------|--------------------| | docker compose up -d | 后台启动所有服务(自动创建网络/卷) | | docker compose down | 停止并删除容器/网络(保留卷) | | docker compose start/stop | 启停服务(不删除容器) | | docker compose logs 服务名 | 查看服务日志(-f 实时跟踪) | | docker compose exec 服务名 bash | 进入服务容器 | ### 五、面试高频问题(含标准答案,高度概括) #### Q1:Docker Compose 解决了什么问题? * 解决手动启动多容器时「参数繁琐、依赖顺序难控制、网络/卷配置混乱」的问题; * 实现多服务配置代码化(YAML),便于版本管理和环境一致化部署。 #### Q2:depends_on 的局限性? * 仅保证服务「启动顺序」,不保证服务「就绪状态」(如先启动DB,但DB未加载完成就启动应用); * 解决方案:应用侧加重试机制,或用 wait-for-it 等脚本检测服务就绪。 #### Q3:Compose 网络默认规则? * 同一 Compose 项目的服务默认加入同一自定义 bridge 网络; * 服务间可通过「服务名」直接访问(内置DNS解析),无需IP。 #### Q4:Compose 与 Docker Swarm/K8s 的区别? * Compose:单主机多容器编排,轻量易用,适合开发/测试环境; * Swarm:Docker 官方集群编排,兼容 Compose 语法,适合中小规模集群; * K8s:重量级容器编排,功能全面,适合大规模生产集群。 #### Q5:Compose 如何实现服务扩缩容? ```bash docker compose up -d --scale 服务名=3 # 将指定服务扩缩容到3个实例 ``` ### 六、核心记忆口诀 > **一个文件定配置,一键启停多服务;** > **服务依赖控顺序,网络卷自动建;** > **单主机用Compose,集群用Swarm/K8s。**

相关推荐
mzhan0173 小时前
Linux: sched: pick_next_task_fair 这个函数的功能
linux·运维·算法
认真的薛薛3 小时前
JVM和pod内存关系
linux·运维·jvm
一点事3 小时前
docker:生产环境部署kkfileview文件预览
运维·docker·容器
susu10830189113 小时前
ubuntu系统检测内核配置是否支持Docker核心模块
运维·docker·容器
国医中兴3 小时前
数据稠密计算的并行处理:从理论到实践
微服务·云原生·容器·kubernetes·k8s
苦瓜小生3 小时前
【Docker】| Docker学习笔记
笔记·学习·docker
小政同学3 小时前
【k8s】HPA实现pod的自动扩缩容
docker·容器·kubernetes
我就是你毛毛哥3 小时前
Docker 安装 Jenkins JDK8 版
java·docker·jenkins
Lucas6494 小时前
K8S-从理论到实战
云原生·容器·kubernetes