Docker Compose 容器编排(十二)
这篇文章介绍了Docker Compose的使用方法。它是Docker官方的开源项目,旨在通过一个docker-compose.yml文件(YAML格式)快速定义相关联的应用容器,满足多个容器相互配合完成某项任务的需求。文章详细介绍了安装与卸载、常用模板命令、顶级元素、常用命令等内容,并给出了具体的参考文献。
Docker Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
通过第一部分中的介绍,我们知道使用一个 Dockerfile
模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Docker Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker Compose
中有**两个重要的概念**
:
service
):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。project
):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml
文件中定义。可见,一个项目可以由多个服务(容器)关联而成,Docker Compose
面向项目进行管理,如下如所示:
docker-compose.yml
,定义一个完整的业务单元,安排好整体应用中的各个容器服务docker-compose up
命令,其创建并运行整个应用程序,完成一键部署上线查看是否安装 docker compose
命令
bashdocker-compose version
Docker-Compose
的版本需要和Docker引擎版本对应,可以参照官网上的对应关系。
bash# 例如从github下载 2.5.0版本的docker-compose
# 下载下来的文件放到 /usr/local/bin目录下,命名为 docker-compose
curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# 添加权限
chmod +x /usr/local/bin/docker-compose
# 验证
docker-compose version
bash# 直接删除 /usr/local/bin/docker-compose文件即可
sudo rm /usr/local/bin/docker-compose
模板文件是使用 Compose
的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run
相关参数的含义都是类似的。
默认的模板文件名称为 compose.yaml
(首选)或 compose.yml
,格式为 YAML 格式。Compose
实现还应该支持 docker-compose.yaml
和 docker-compose.yml
以实现向后兼容性。如果两个文件都存在,则 Compose
实现必须更喜欢规范的 compose.yaml
之一。
注意:每个服务都必须通过 image
指令指定镜像或 build
指令(需要 Dockerfile)等来自动构建生成镜像。如果使用 build
指令,在 Dockerfile
中设置的选项(例如:CMD
, EXPOSE
, VOLUME
, ENV
等) 将会自动被获取,无需在 compose.yml
中重复设置。
Docker Compose 的 YAML 文件包含 4 个一级 key : version、services、networks、volumes。
下面分别介绍常用各个指令的用法。完整的 docker compose
模板命令参考官方文档:https://docs.docker.com/compose/compose-file/
Version: 定义了 Compose 文件格式(主要是 API)的版本,总是位于第一行。
bashversion: "3"
Services:定义容器或服务的配置文件。
build:指定 Dockerfile
所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose
将会利用它自动构建这个镜像,然后使用这个镜像。
bashservices: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
说明:
context
指令指定 Dockerfile
所在文件夹的路径。dockerfile
指令指定 Dockerfile
文件名。arg
指令指定构建镜像时的变量。command:覆盖容器镜像(即 Dockerfile 的)声明的默认命令。
bashcommand: bundle exec thin -p 3000
command: ["bundle", "exec", "thin", "-p", "3000"]
container_name:指定自定义容器名称
(而不是生成的默认名称)的字符串。
bashcontainer_name: my-web-container
depends_on:表示服务之间的启动和关闭依赖关系。
db
redis
web
进行创建。web
db
redis
进行删除。bashservices: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
dns:定义了要在容器网络接口配置上设置的自定义 DNS 服务器。 可以是单个值或列表。
bashdns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
environment:用来给容器启动指定的环境变量,相当于 docker run -e
选项。
bash# 映射语法
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db_springboot'
MYSQL_USER: 'springboot'
MYSQL_PASSWORD: 'springboot'
# 数组语法
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT
env_file:根据文件内容向容器添加环境变量。
bashenv_file: .env
expose:定义 compose 从容器中公开的端口。
bashexpose:
- "3000"
- "8000"
注:以上指令将当前容器的端口3000和8000暴露给其他容器,和 ports 的区别是,expose 不会将端口暴露给主机,主机无法访问 expose 的端口。
extra_hosts:将添加主机名映射添加到到容器网络接口配置(/etc/hosts
for Linux)。值必须以 HOSTNAME
bashextra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
image:指定容器启动的镜像。
jsximage: redis
image: redis:5
image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis
network_mode:设置容器网络模式,可用参数如下:
jsxnetwork_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
networks:定义容器使用的网络。
jsxnetworks:
- some-network
- other-network
ports:暴露容器端口到主机的任意端口或指定端口,用法:
jsxports:
- "80:80" # 绑定容器的80端口到主机的80端口
- "9000:80" # 绑定容器的80端口到主机的9000端口
- "443" # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号
注:不管是否指定主机端口,使用ports都会将端口暴露给主机和其他容器
restart:定义了平台将在容器终止时应用的策略
jsxrestart: "no"
restart: always
restart: on-failure
restart: unless-stopped
volumes:定义容器数据卷挂载
jsxservices:
backend:
image: awesome/backend
volumes:
- type: volume
source: db-data
target: /data
volume:
nocopy: true
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock
volumes:
db-data:
短语法模式:
jsx# 语法
volume:CONTAINER_PATH
volume:CONTAINER_PATH:access_mode
volumes_from:从另一个服务或容器挂载所有容器卷,可以选择指定只读访问(ro)或读写(rw)。如果未指定访问级别,则必须使用读写。
jsxvolumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
working_dir: 从 image
指定的目录覆盖容器的工作目录(即Dockerfile WORKDIR
)。
networks:用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。 这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不同的网络类型。
在下面的示例中,在运行时,将创建网络前端和后端,并将前端服务连接到前端网络和后端网络。
jsxservices:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
networks:
front-tier:
back-tier:
volumes:用于指引 Docker 来创建新的卷。
卷部分允许配置可跨多个服务重用的命名卷。下面是一个双服务设置的示例,其中数据库的数据目录作为名为 db-data 的卷与另一个服务共享,以便可以定期备份:
jsxservices:
backend:
image: awesome/database
volumes:
- db-data:/etc/data
backup:
image: backup-service
volumes:
- db-data:/var/lib/backup/data
volumes:
db-data:
命令 | 说明 |
---|---|
up | 创建和启动容器 |
down | 删除容器、网络、数据卷和镜像 |
build | 重新构建服务 |
ps | 列出容器 |
exec | 进入容器,在容器里面执行命令 |
top | 显示容器进程 |
logs | 查看容器日志 |
pause、unpause | 暂停、恢复整个项目所有服务或指定服务 |
rm | 删除整个项目或者指定服务 |
start、stop、restart | 开始、停止、重启整个项目所有服务或指定服务 |
ls | 列出正在运行的 compose 项目 |
version | 列出 compose 版本 |
为服务构建、(重新)创建、启动和附加到容器。该命令聚合每个容器的输出(像 does 一样)。当命令退出时,所有容器都将停止。-d
参数将在后台启动并运行容器。
jsx# 语法
docker compose up [OPTIONS] [SERVICE...]
选项 | 描述 |
---|---|
–abort-on-container-exit | 如果任何容器被停止,则停止所有容器。注意:不兼容 -d |
–always-recreate-deps | 重新创建容器依赖。注意不兼容 --no-recreate |
–attach | 附加到服务输出。 |
–attach-dependencies | 附加到相关容器。 |
–build | 在启动容器之前构建镜像。 |
–detach,-d | 分离模式:在后台运行容器 |
–exit-code-from | 返回所选服务容器的退出代码。意味着 --abort-on-container-exit |
–force-recreate | 重新创建容器,即使它们的配置和镜像没有更改。 |
–no-build | 即使镜像缺失,也不构建这个容器 |
–no-color | 使用单色输出 |
–no-deps | 不要启动链接服务 |
–no-log-prefix | 不要打印日志前缀 |
–no-recreate | 如果容器已经存在,就不要重新创建它们。不兼容 --force-recreate。 |
–no-start | 创建容器后不要启动服务 |
–pull | 运行前提取镜像 (“always”、“missing”、“never”) ,默认值为 missing。 |
–quiet-pull | 拉取镜像时,不要打印镜像信息。 |
–remove-orphans | 为没有在 Compose 文件中定义的服务删除容器。 |
–renew-anon-volumes,-V | 重新创建匿名卷,而不是从以前的容器检索数据。 |
–timeout,-t | 在附加容器或容器已经在运行时,使用此超时时间(以秒为单位)来关闭容器,默认为10秒。 |
停止容器并删除 up 创建的容器、网络和镜像。
默认情况下,删除的东西只有:
注意:定义为外部的网络和卷永远不会被删除。默认情况下,不删除匿名卷。然而,由于它们没有一个稳定的名称,它们不会被后续的up自动挂载。对于需要在更新之间持久保存的数据,使用显式路径作为绑定挂载或命名卷。
jsx# 语法
docker compose down [OPTIONS]
选项 | 描述 |
---|---|
–remove-orphans | 删除未在 Compose 文件中定义的服务的容器。 |
–rmi | 删除服务使用的镜像。"local"只删除没有自定义标签的图片(“local”、“all”) |
–timeout,-t | 指定以秒为单位的关机超时时间,默认为 10 秒。 |
–volumes,-v | 删除在 Compose 文件的 volumes 部分声明的命名卷和附加到容器的匿名卷。 |
用于构建或重新构建服务
jsx# 语法
docker compose build [OPTIONS] [SERVICE...]
选项 | 描述 |
---|---|
–build-arg | 为服务设置构建时变量。 |
–memory,-m | 为构建容器设置内存限制。 |
–no-cache | 在构建镜像时不使用缓存。 |
–progress | 设置进度输出类型(auto,tty, plain, quiet),默认为 auto。 |
–pull | 总是尝试拉出镜像的新版本。 |
–quiet,-q | 不要向STDOUT打印任何内容。 |
–ssh | 设置构建服务镜像时使用的SSH身份验证。(使用默认的SSH代理时使用’default’) |
列出Compose项目的容器,以及当前状态和公开的端口。默认情况下,运行和停止的容器都显示出来。
jsx# 语法
docker compose ps [OPTIONS] [SERVICE...]
选项 | 描述 |
---|---|
–all,-a | 显示所有已停止的容器(包括由run命令创建的容器) |
–filter | 通过属性过滤服务,例如 status |
–format | 格式化输出,可选格式:pretty 、 json |
–quiet,-q | 只显示 id |
–services | 显示服务 |
–status | 按状态过滤服务,可选状态:paused、restarting、removing、running、dead、created、exited |
在运行的容器中执行命令。这相当于针对 Compose 服务的 docker exec
。通过这个子命令,您可以在服务中运行任意命令。默认情况下,命令会分配TTY,因此可以使用 docker compose exec web sh
等命令来获得交互式提示。
jsx# 语法
docker compose exec [OPTIONS] SERVICE COMMAND [ARGS...]
选项 | 描述 |
---|---|
–detach,-d | 分离模式,运行命令在后端。 |
–env,-e | 设置环境变量。 |
–index | 如果一个服务有多个实例,则使用容器的索引,默认值为 1 。 |
–interactive,-i | 保持STDIN打开,即使没有连接,默认值为 true 。 |
–user,-u | 以该用户运行该命令。 |
–workdir,-w | 此命令的 workdir 目录路径。 |
显示正在运行的进程。
jsx# 语法
docker compose top [SERVICES...]
查看容器的日志输出。
jsx# 语法
docker compose logs [OPTIONS] [SERVICE...]
选项 | 描述 |
---|---|
–follow,-f | 跟踪日志输出。 |
–no-color | 使用单色输出。 |
–no-log-prefix | 不打印日志前缀。 |
–since | 显示自时间戳以来的日志,示例: (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) |
–tail | 从每个容器的日志末尾开始显示的行数。默认需要跟参数 all 。 |
–timestamps,-t | 显示时间戳。 |
–until | 显示自时间戳之前的日志,示例: (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) |
暂停/取消暂停正在运行的服务容器。
jsx# 暂停语法
docker compose pause [SERVICE...]
# 取消暂停语法
docker compose unpause [SERVICE...]
移除停止的服务容器
jsx# 语法
docker compose rm [OPTIONS] [SERVICE...]
选项 | 描述 |
---|---|
–force,-f | 不要询问是否要移除。 |
–stop,-s | 删除容器之前停止容器。 |
–volumes,-v | 删除连接到容器的所有匿名卷。 |
开始、停止、重启服务
jsx# 开始服务
docker compose start [SERVICE...]
# 停止服务
docker compose stop [SERVICE...]
# 重启服务
docker compose restart [SERVICE...]
列出正在运行的容器项目
jsx# 语法
docker compose ls [OPTIONS]
选项 | 描述 |
---|---|
–all,-a | 显示全部的 compose 项目。 |
–filter | 根据提供的条件筛选输出。 |
–format | 格式化输出,可选格式:pretty、json,默认为pretty。 |
–quiet,-q | 只显示 id。 |
显示Docker Compose版本信息
jsxdocker compose version [OPTIONS]
选项 | 描述 |
---|---|
–format,-f | 格式化输出,可选格式:pretty、json,默认为pretty。 |
–short | 只显示Compose的版本号。 |
bash# docker-compose文件版本号
version: "3"
# 配置各个容器服务
services:
microService:
image: springboot_docker:1.0
container_name: ms01 # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- springboot_network
depends_on: # 配置该容器服务所依赖的容器服务
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:data
networks:
- springboot_network
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db_springboot'
MYSQL_USER: 'springboot'
MYSQL_PASSWORD: 'springboot'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- springboot_network
command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问
networks:
# 创建 springboot_network 网桥网络
springboot_network:
docker-compose.yml
后,进行语法检查:bash# 进行语法检查
docker-compose config -q
bashdocker-compose up -d
本文作者:LiuXueChao
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!