type
status
date
slug
summary
tags
category
icon
password
文章状态
通过一个 Dockerfile 文件可以让用户很方便的定义一个单独的应用容器镜像。然而,在日常工作中,经常会碰到需要 多个容器相互配合来完成某项任务 的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。
什么是 Docker Compose ?
Compose 项目是 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
。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 -f compose.yml up -d
Compose 文件元素
Compose 文件是通过 YAML 文件定义的,由以下几个 顶级元素 组成 :
- Version (可选/已淘汰)
版本
- Name (可选)
项目名
- Services (必须)
服务,即容器
- Networks
网络
- Volumes
存储卷
- Configs
明文配置
- Secrets
密文配置
version
和 name
元素属性
version
和 name
元素属性- version
version 是为了向后兼容保留的,没有实际用途,也不会影响运行效果。
- name
定义项目名称,默认使用compose.yml
文件所在的目录名
services
元素属性
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 自动解析某些内容为对应的布尔语义。这些特定词汇,包括: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 守护进程的配置文件中进行修改。
注!:当使用
HOST_PORT:CONTAINER_PORT
格式来映射端口时,若使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果——这是因为 YAML 会自动解析 xx:yy
这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。long 语法
long 语法支持配置 short 语法中不支持的附加字段。这些附加字段如下:
target
:指定容器内的端口;
published
:指定宿主机公开的端口;
protocol
:指定端口协议(tcp
/udp
);
mode
:使用 host 在每个节点公开一个主机端口。
举例
depends_on
元素属性
解决容器的依赖、启动先后的问题。
例:先启动redis
和db
再启动web
networks
元素属性
networks
元素属性配置容器连接的网络。
默认会创建一个网桥,value 为空代表网桥相关参数为默认选项
volumes
元素属性
volumes
元素属性定义容器可访问的挂载主机路径或命名卷。
例,等同于docker run -v log-dir:/var/log/nginx
可指定多种类型的挂载,如
volume
、 bind
、 tmpfs
。通过使用type
、source
、target
子元素来声明
configs
元素属性
configs
元素属性将配置文件作为文件挂载到服务容器的文件系统中。
configs
允许服务在无需重建 Docker 镜像情况下调整其配置。使用子元素 file
指定文件在宿主机的所在路径。容器内挂载点的位置在 Linux 容器中默认为/<config-name>
;
也可指定容器内配置文件挂载路径。
类似volumes
属性,可通过使用type
、source
、target
子元素来声明
secrets
元素属性
secrets
元素属性存储敏感数据,例如证书、服务的密码。同样使用子元素
file
指定文件在宿主机的所在路径。密文,容器内的默认挂载路径为/run/secrets/my_secret
案例讲解
此案例为部署 Wordpress 项目
相关引用文章(REF):
- 作者:yomax66
- 链接:https://yomax66.xyz//learning/docker%20compose
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。