在实际工作中,部署一个应用可能需要部署多个容器,一个一个部署非常不方便。docker compose可以一键部署和启动多个容器,它使用yaml文件来编排服务。github和docker hub很多项目都提供了docker-compose.yaml文件,我们可以一键部署项目,非常方便。
这里可以使用vscode去学习docker compose的格式
一键部署
将以下内容保存到本地的docker-compose.yml文件中。
docker compose命令启动时,默认在当前目录下寻找compose.yaml或compose.yml,为了兼容之前的版本,也会查找docker-compose.yaml或docker-compose.yml。
也可以使用-f参数手动指定文件docker compose -f docker-compose-dev.yml up -d
docker compose up -d一键部署启动
docker compose start/stop启动/停止服务
docker compose down停止并删除容器,不会删除存储卷volume
compose文件结构
docker-compose.yml通常需要包含以下几个顶级元素:
version 已弃用,早期版本需要此元素
services 必要元素,定义一个或多个容器的运行参数
services 中可以通过以下元素定义容器的运行参数
主要关注 端口映射、环境变量、挂载数据持久化、容器重启策略
image | 容器镜像 |
ports | 端口映射 |
environment | 环境变量 |
networks | 容器使用的网络 |
volumes | 容器挂载的存储卷 |
command | 容器启动时执行的命令 |
depends_on | 定义启动顺序 |
复数形式,ports、networks、depends_on参数需传入列表 |
yaml文件语法
- 上下级关系
- 不允许使用Tab键,只允许使用空格
- : 键值对,后面必须有空格
- -列表,后面必须有空格
- [ ]数组
- #注释
- {key:value,k1:v1}map
- | 多行文本块
- --- 表示一个文档的开始
- 把公共的配置提取出来,用&来建立锚点,<<合并到当前数据,用*引用锚点
编排自己的项目
command 支持以下写法:
#推荐使用数组或列表的方式
#数组
command:
["java",
"-jar",
"/usr/local/src/ruoyi-admin.jar"
]
#列表
command:
- java
- -jar
- /usr/local/src/ruoyi-admin.jar
# shell命令模式
command: java -jar /usr/local/src/ruoyi-admin.jar
environment 支持如下两种写法:
# 使用map
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
#使用列表
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=ry
- LANG=C.UTF-8
容器启动顺序 depends_on
数据库初始化完成之前,不会建立connections。
depends_on 只能保证容器的启动和销毁顺序,不能保证依赖的容器是否ready
要确保应用服务在数据库初始化完成后再启动,需要配合condition
和healthcheck
使用。
condition有三种状态:
- service_started容器已启动
- service_healthy容器处于健康状态
- service_completed_successfully容器执行完成且成功退出(退出状态码为0)
重启策略
以下是几种常用的重启策略:
- no:这是默认值。表示容器停止后不会自动重启。
- always:表示容器停止后总是自动重启。
- unless-stopped:表示容器停止后除非明确停止(使用
docker-compose stop
或手动停止),否则总是自动重启。 - on-failure:表示容器非正常退出(即退出状态非 0)时自动重启。可以通过
restart
的on-failure
子选项来指定最大的重启次数,例如restart: on-failure:5
表示容器在失败时最多尝试重启 5 次。 - unless-stopped:表示容器停止后除非明确停止(使用
docker-compose stop
或手动停止),否则总是自动重启。