九、 docker compose
00 分钟
2024-6-26
2024-7-22
type
status
date
slug
summary
tags
category
icon
password
文章状态
🤔
通过一个 Dockerfile 文件可以让用户很方便的定义一个单独的应用容器镜像。然而,在日常工作中,经常会碰到需要 多个容器相互配合来完成某项任务 的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。

什么是 Docker Compose ?

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
其定位是 "定义和运行多个 Docker 容器的应用"
其定位是 "定义和运行多个 Docker 容器的应用"
Defining and running multi-container Docker applications
其允许用户通过一个单独的 docker-compose.yml 来定义一组相关联的应用容器为一个项目
Compose 中有两个重要的概念:
  • 服务 (service)
    • 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 (project)
    • 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose 默认管理对象项目 ,通过子命令对项目中的一组容器进行便捷地生命周期管理。

安装

目前 Docker 官方用 GO 语言重写了 Docker Compose,并将其作为了 docker cli 的子命令,称为 Compose V2。若未安装,可参照官方文档安装,然后将 v1 版的 docker-compose 命令替换为 docker compose。
目前 Docker 官方用 GO 语言重写了 Docker Compose,并将其作为了 docker cli 的子命令,称为 Compose V2。若未安装,可参照官方文档安装,然后将 v1 版的 docker-compose 命令替换为 docker compose
V1 版本的安装
V2 版本的安装

应用模型(例)

一个项目通常由以下几部分组成:
  • services
  • networks
  • volumes
  • configs
  • secrets
e.g. 某应用 compose.yml 文件

运行项目(例)

现在有一个 python 的项目,依赖 Redis 服务,我们使用 compose 的方式将服务运行起来。
步骤一 创建应用文件
创建目录 compose-python-demo ,进入目录创建文件 app.py,其内容如下:
创建文件 requirements.txt ,其内容如下:
步骤二 创建 Dockerfile 文件
创建 Dockerfile 文件 ,其内容如下:
 
步骤三 定义 compose 声明文件
定义 compose 服务
步骤四 构建和运行应用

Docker compose 命令

语法
启动项目
docker compose up
停止项目
docker compose down -v 参数为移除与服务相关的所有卷,包括默认卷和用户定义卷。
查看服务日志
docker compose logs
docker compose  命令执行时必须在 compose.yaml 文件所在的目录下,因为此命令执行时默认省略了参数 -f compose.yml 。
docker compose 命令执行时必须在 compose.yaml 文件所在的目录下,因为此命令执行时默认省略了参数 -f compose.yml
启动项目的完整命令为:docker compose -f compose.yml up -d

Compose 文件元素

Compose 文件是通过 YAML 文件定义的,由以下几个 顶级元素 组成 :
  • Version (可选/已淘汰)
    • 版本
  • Name (可选)
    • 项目名
  • Services (必须)
    • 服务,即容器
  • Networks
    • 网络
  • Volumes
    • 存储卷
  • Configs
    • 明文配置
  • Secrets
    • 密文配置

version name 元素属性

  • version
    • version 是为了向后兼容保留的,没有实际用途,也不会影响运行效果。
  • name
    • 定义项目名称,默认使用 compose.yml 文件所在的目录名

services 元素属性

Services 是计算资源的抽象定义,由一组容器组成,services 中的所有容器都是根据这些参数创建的。compose 文件中 必须 声明 services 元素。
build 元素属性
指定 Dockerfile 所在目录的路径。Compose 将会利用它自动构建这个镜像,然后使用此镜像。
此路径可以是绝对路径,或者相对 compose.yml 文件的路径
子元素:
  • context :指定 Dockerfile 所在目录的路径。
  • dockerfile :指定 Dockerfile 文件名。
  • target :指定要构建的阶段,如在多阶段构建中。
command 元素属性
覆盖容器启动后默认执行的命令。
restart 元素属性
指定容器退出后的重启策略为始终重启。
该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped
healthcheck 元素属性
通过命令检查容器是否健康运行。
enviroment 元素属性
设置环境变量。可使用数组或对象两种格式。
给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
如果变量名称或者值中用到 true | false,yes | no 等表达布尔含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括:
如果变量名称或者值中用到 true | falseyes | no 等表达布尔含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括:
y | Y | yes | Yes | YES | n | N | no | No | NO | true | True | TRUE | false | False | FALSE | on | On | ON | off | Off | OFF
expose 元素属性
暴露端口,但不映射到宿主机。服务间可以互相访问。
仅可以指定内部端口为参数
ports 元素属性
暴露端口信息。 共有2种表示语法。
short 语法
格式可为 HOST_PORT:CONTAINER_PORT ,等同于 docker run 后加 -p 标签;
格式可为 CONTAINER_PORT ,等同于 docker run 后加 -P 标签,宿主机随机端口。
默认情况下,Docker 使用的随机端口范围是从 32768 到 61000。此范围可在 Docker 守护进程的配置文件中进行修改。
默认情况下,Docker 使用的随机端口范围是从 32768 到 61000。此范围可在 Docker 守护进程的配置文件中进行修改。
注!:当使用 HOST_PORT:CONTAINER_PORT 格式来映射端口时,若使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果——这是因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
注!:当使用 HOST_PORT:CONTAINER_PORT 格式来映射端口时,若使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果——这是因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式
long 语法
long 语法支持配置 short 语法中不支持的附加字段。这些附加字段如下:
  • target:指定容器内的端口;
  • published:指定宿主机公开的端口;
  • protocol:指定端口协议(tcp / udp);
  • mode:使用 host 在每个节点公开一个主机端口。
    举例
    depends_on 元素属性
    解决容器的依赖、启动先后的问题。
    例:先启动 redisdb 再启动 web

    networks 元素属性

    配置容器连接的网络。
    默认会创建一个网桥,value 为空代表网桥相关参数为默认选项

    volumes 元素属性

    定义容器可访问的挂载主机路径或命名卷。
    例,等同于 docker run -v log-dir:/var/log/nginx
    可指定多种类型的挂载,如 volumebindtmpfs
    通过使用 typesourcetarget 子元素来声明

    configs 元素属性

    将配置文件作为文件挂载到服务容器的文件系统中。configs 允许服务在无需重建 Docker 镜像情况下调整其配置。使用子元素 file 指定文件在宿主机的所在路径。
    容器内挂载点的位置在 Linux 容器中默认为 /<config-name>
    也可指定容器内配置文件挂载路径。
    类似 volumes 属性,可通过使用 typesourcetarget 子元素来声明

    secrets 元素属性

    存储敏感数据,例如证书、服务的密码。同样使用子元素 file 指定文件在宿主机的所在路径。
    密文,容器内的默认挂载路径为 /run/secrets/my_secret

    案例讲解

    此案例为部署 Wordpress 项目
    相关引用文章(REF):
    上一篇
    十、镜像缓存与多级构建
    下一篇
    八、YAML