docker-cpmpose是用来编排容器
比如,想要同时运行mysql、nginx等几个镜像,常规方法是需要一个一个的启动,并同时选择参数(环境,端口,容器命名)
使用docker-cpmpose后,便可以将上面的这些命令写到一个docker-composer.yml文件中
这个配置文件写完了后,直接一个docker-composer up命令即可
Compose 使用的三个步骤:
写完了
使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)
它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
官方文档:https://docs.docker.com/compose/compose-file/
定义一组相关联的容器为一个工程 (project)
。一个工程包含多个服务 (service)
,每个服务中定义了创建容器时所需的镜像、参数、依赖等
需要关注的顶级配置有 version
、services
、networks
、volumes
几个部分,除 version
外,其他几个顶级配置下还有很多下级配置
描述 Compose 文件的版本信息
指定创建容器时所需的镜像名称标签或者 镜像 ID 。如果镜像在本地不存在,会去远程拉取
services:
web:
image: hello-world
可以基于指定的镜像构建容器,还可以基于 Dockerfile 文件构建,在使用 up 命令(docker-compose启动)时会执行构建任务
该选项可以是 Dockerfile 文件的绝对/相对路径,也可以是远程 Git 仓库的 URL,当提供的值是相对路径时,相对当前 docker-compose.yml 文件所在目录
一般情况下,默认都基于文件名叫 Dockerfile 的文件构建镜像,当然也可以是自定义的文件名,使用 dockerfile 声明,不过这个选项只能声明文件名,文件所在路径还是要通过 centext 来声明
build:
context: . # 相对当前 docker-compose.yml 文件所在目录
dockerfile: Dockerfile-alternate # 基于名称为 Dockerfile-alternate 的文件构建镜像
Compose 创建的容器默认生成的名称格式为:工程名称_服务条目名称_序号。如果要使用自定义名称,使用 container_name 声明。
services:
mycentos:
build: .
container_name: mycentos7 # 容器名称,默认为"工程名称_服务条目名称_序号"
因为 Docker 容器名称必须是唯一的,所以如果指定了自定义名称,就不能将服务扩展至多个容器
当在没有启动数据库容器的情况下启动了 Web 应用容器,应用容器会因为找不到数据库而退出。
depends_on 就是用来解决容器依赖、启动先后问题的配置项
下面的yml定义的容器会先启动 db 和 redis 两个服务,最后才启动 web 服务
version: "3.8"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: mysql
容器对外暴露的端口,格式:宿主机端口:容器端口
ports:
- "80:80"
- "8080:8080"
容器暴露的端口不映射到宿主机,只允许能被连接的服务访问
expose:
- "80"
- "8080"
容器重启策略,简单的理解就是 Docker 重启以后容器要不要一起启动:
services:
nginx:
image: nginx
container_name: mynginx
ports:
- "80:80"
restart: always
添加环境变量。可以使用数组也可以使用字典。布尔相关的值(true、false、yes、no)都需要用引号括起来,以确保 YML 解析器不会将它们转换为真或假。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
或者下面的格式
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
从文件中获取环境变量,可以指定一个或多个文件,其优先级低于 environment 指定的环境变量。
env_file:
- /opt/runtime_opts.env # 绝对路径
- ./common.env # 相对路径,相对当前 docker-compose.yml 文件所在目录
- ./apps/web.env # 相对路径,相对当前 docker-compose.yml 文件所在目录
env 文件中的每一行需采用 键=值 格式。以 # 开头的行会被视为注释并被忽略。空行也会被忽略。
数据卷,用于实现目录挂载,支持指定目录挂载、匿名挂载、具名挂载。
# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
mysql: # 服务名称
image: mysql:8 # 创建容器时所需的镜像
container_name: mysql8 # 容器名称,默认为"工程名称_服务条目名称_序号"
ports: # 宿主机与容器的端口映射关系
- "3306:3306" # 左边宿主机端口:右边容器端口
environment: # 创建容器时所需的环境变量
MYSQL_ROOT_PASSWORD: root
volumes:
# 绝对路径
- "/opt/data/docker_mysql/data:/var/lib/mysql"
# 相对路径,相对当前 docker-compose.yml 文件所在目录
- “./conf:/etc/mysql/conf.d“
# 匿名挂载,匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volume 中生成
- "/var/lib/mysql"
# 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成
- "mysql-data-volume:/var/lib/mysql"
从另一个服务或容器挂载它的所有卷。
volumes_from:
- service_name
- container_name
配置容器连接的网络,引用顶级 networks 下的条目
# 定义服务,可以多个
services:
nginx: # 服务名称
networks: # 配置容器连接的网络,引用顶级 networks 下的条目
- nginx-net # 一个具体网络的条目名称
网络上此服务的别名。同一网络上的其他容器可以使用服务名或此别名连接到服务容器。同一服务在不同的网络上可以具有不同的别名。
# 定义服务,可以多个
services:
nginx: # 服务名称
networks: # 配置容器连接的网络,引用顶级 networks 下的条目
nginx-net: # 一个具体网络的条目名称
aliases: # 服务别名,可以多个
- nginx1 # 同一网络上的其他容器可以使用服务名或此别名连接到服务容器
再详细把配置的不同方式
# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
mysql:
image: mysql:8
container_name: mysql8
ports:
- "3306:3306"
environment
MYSQL_ROOT_PASSWORD: root
volumes:
# 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成
- "mysql-data-volume:/var/lib/mysql"
# 定义数据卷,可以多个
volumes:
mysql-data-volume: # 一个具体数据卷的条目名称
以下方式的数据卷声明创建卷时会使用自定义的名称
# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
mysql:
image: mysql:8
container_name: mysql8
ports:
- "3306:3306"
environment
MYSQL_ROOT_PASSWORD: root
volumes:
# 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成
- "mysql-data-volume:/var/lib/mysql"
# 定义数据卷,可以多个
volumes:
mysql-data-volume: # 一个具体数据卷的条目名称
name: mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"
如果不声明网络,每个工程默认会创建一个网络名称为"工程名称_default"的 bridge 网络
# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
nginx:
image: nginx
container_name: mynginx
ports:
- "80:80"
networks: # 配置容器连接的网络,引用顶级 networks 下的条目
nginx-net:
# 定义网络,可以多个
networks:
nginx-net: # 一个具体网络的条目名称
name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"
driver: bridge # 网络模式,默认为 bridge
# 查看帮助
docker-compose -help
指定多个 yml 加 -f 选项。以守护进程模式运行加 -d 选项。
# 前台启动
docker-compose up
# 后台启动
docker-compose up -d
# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml
docker-compose -f docker-compose.yml up -d
# 输出日志,不同的服务输出使用不同的颜色来区分
docker-compose logs
# 跟踪日志输出
docker-compose logs -f
# 关闭颜色
docker-compose logs --no-color
# 列出工程中所有服务的容器
docker-compose ps
# 列出工程中指定服务的容器
docker-compose ps nginx
# 进入工程中指定服务的容器
docker-compose exec nginx bash
# 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
docker-compose exec --index=1 nginx bash
# 暂停工程中所有服务的容器
docker-compose pause
# 暂停工程中指定服务的容器
docker-compose pause nginx
# 恢复工程中所有服务的容器
docker-compose unpause
# 恢复工程中指定服务的容器
docker-compose unpause nginx
# 重启工程中所有服务的容器
docker-compose restart
# 重启工程中指定服务的容器
docker-compose restart nginx
# 启动工程中所有服务的容器
docker-compose start
# 启动工程中指定服务的容器
docker-compose start nginx
# 停止工程中所有服务的容器
docker-compose stop
# 停止工程中指定服务的容器
docker-compose stop nginx
# 删除所有(停止状态)服务的容器
docker-compose rm
# 先停止所有服务的容器,再删除所有服务的容器
docker-compose rm -s
# 不询问是否删除,直接删除
docker-compose rm -f
# 删除服务容器挂载的数据卷
docker-compose rm -v
# 删除工程中指定服务的容器
docker-compose rm -sv nginx
# 打印所有服务的容器所对应的镜像
docker-compose images
# 打印指定服务的容器所对应的镜像
docker-compose images nginx
# 显示工程中所有服务的容器正在运行的进程
docker-compose top
# 显示工程中指定服务的容器正在运行的进程
docker-compose top nginx
参考链接:https://thinkwon.blog.csdn.net/article/details/119511551
官方文档:https://docs.docker.com/compose/compose-file/
菜鸟文档:https://www.runoob.com/docker/docker-compose.html