2023-12-12
Docker
00

目录

Docker Compose 容器编排(十二)
一、简介
二、Compose使用的三个步骤:
三、安装与卸载
1、通过 安装与卸载 docker compose
✈️ 安装
🪂 卸载
四、compose 常用模板命令
1、顶级元素 Version
2、顶级元素 Services
(1)build
(2)command
(3)container_name
(4)depends_on
(5)dns
(6)environment
(7)env_file
(8)expose
(9)extra_hosts
(10)image
(11)network_mode
(12)networks
(13)ports
(14)restart
(15)volumes
(16)volumes_from
(17)working_dir
3、顶级元素 Networks
4、顶级元素 Volumes
五、compose 常用命令
1、up
Options
2、down
Options
3、build
Options
4、ps
Options
5、exec
Options
6、top
7、logs
Options
8、pause、unpause
9、rm
Options
10、start、stop、restart
11、ls
Options
12、version
Options
六、compose编排实例
(1)书写编排文件
(2)编写完成docker-compose.yml后,进行语法检查:
(3)如果语法检查没有任何问题,进行创建、启动:

Docker Compose 容器编排(十二)

这篇文章介绍了Docker Compose的使用方法。它是Docker官方的开源项目,旨在通过一个docker-compose.yml文件(YAML格式)快速定义相关联的应用容器,满足多个容器相互配合完成某项任务的需求。文章详细介绍了安装与卸载、常用模板命令、顶级元素、常用命令等内容,并给出了具体的参考文献。

Docker Compose 容器编排(十二)

一、简介

Docker Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。

通过第一部分中的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Docker Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Docker Compose 中有**两个重要的概念**

  • 🐚 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 🐌 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

可见,一个项目可以由多个服务(容器)关联而成,Docker Compose 面向项目进行管理,如下如所示:

https://image.myxuechao.com/docker/65.png

二、Compose使用的三个步骤:

  1. 编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件
  2. 编写 docker-compose.yml,定义一个完整的业务单元,安排好整体应用中的各个容器服务
  3. 执行 docker-compose up 命令,其创建并运行整个应用程序,完成一键部署上线

三、安装与卸载

查看是否安装 docker compose 命令

bash
docker-compose version

1、通过 安装与卸载 docker compose

✈️ 安装

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 常用模板命令

模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。

默认的模板文件名称为 compose.yaml(首选)或 compose.yml,格式为 YAML 格式。Compose 实现还应该支持 docker-compose.yaml 和 docker-compose.yml 以实现向后兼容性。如果两个文件都存在,则 Compose 实现必须更喜欢规范的 compose.yaml 之一。

注意:每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMDEXPOSEVOLUMEENV 等) 将会自动被获取,无需在 compose.yml 中重复设置。

Docker Compose 的 YAML 文件包含 4 个一级 key : version、services、networks、volumes。

下面分别介绍常用各个指令的用法。完整的 docker compose 模板命令参考官方文档:https://docs.docker.com/compose/compose-file/

1、顶级元素 Version

Version: 定义了 Compose 文件格式(主要是 API)的版本,总是位于第一行。

bash
version: "3"

2、顶级元素 Services

Services:定义容器或服务的配置文件。

(1)build

build:指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

bash
services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1

说明:

  • context 指令指定 Dockerfile 所在文件夹的路径。
  • dockerfile 指令指定 Dockerfile 文件名。
  • arg 指令指定构建镜像时的变量。

(2)command

command:覆盖容器镜像(即 Dockerfile 的)声明的默认命令。

bash
command: bundle exec thin -p 3000 command: ["bundle", "exec", "thin", "-p", "3000"]

(3)container_name

container_name:指定自定义容器名称(而不是生成的默认名称)的字符串。

bash
container_name: my-web-container

(4)depends_on

depends_on:表示服务之间的启动和关闭依赖关系。

  • 🎸 Compose 创建服务必须按依赖顺序 db redis web 进行创建。
  • 🎺 Compose 删除服务必须按依赖顺序 web db redis 进行删除。
bash
services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres

(5)dns

dns:定义了要在容器网络接口配置上设置的自定义 DNS 服务器。 可以是单个值或列表。

bash
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9

(6)environment

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

(7)env_file

env_file:根据文件内容向容器添加环境变量。

bash
env_file: .env

(8)expose

expose:定义 compose 从容器中公开的端口。

bash
expose: - "3000" - "8000"

注:以上指令将当前容器的端口3000和8000暴露给其他容器,和 ports 的区别是,expose 不会将端口暴露给主机,主机无法访问 expose 的端口。

(9)extra_hosts

extra_hosts:将添加主机名映射添加到到容器网络接口配置(/etc/hosts for Linux)。值必须以 HOSTNAME

的形式为其他主机设置主机名和 IP 地址。

bash
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"

(10)image

image:指定容器启动的镜像。

jsx
image: redis image: redis:5 image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7 image: library/redis image: docker.io/library/redis image: my_private.registry:5000/redis

(11)network_mode

network_mode:设置容器网络模式,可用参数如下:

  • none:禁用所有容器网络
  • host:它为容器提供对主机网络接口的原始访问权限
  • service:{name}:只允许容器访问指定的服务
jsx
network_mode: "host" network_mode: "none" network_mode: "service:[service name]"

(12)networks

networks:定义容器使用的网络。

jsx
networks: - some-network - other-network

(13)ports

ports:暴露容器端口到主机的任意端口或指定端口,用法:

jsx
ports: - "80:80" # 绑定容器的80端口到主机的80端口 - "9000:80" # 绑定容器的80端口到主机的9000端口 - "443" # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号

注:不管是否指定主机端口,使用ports都会将端口暴露给主机和其他容器

(14)restart

restart:定义了平台将在容器终止时应用的策略

  • no:默认重启策略,在任何情况下都不会重新启动容器。
  • always:该策略会始终重启容器,直到容器删除。
  • no-failure:如果退出代码指示错误,策略将重新启动容器。
  • unless-stopped:该策略会重新启动容器,而不考虑退出代码,但会在服务停止或删除时停止重新启动。
jsx
restart: "no" restart: always restart: on-failure restart: unless-stopped

(15)volumes

volumes:定义容器数据卷挂载

jsx
services: 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
  • volume:可以是平台托管容器(bind mount)上的主机路径,也可以是卷名
  • CONTAINER_PATH:挂载卷的容器中的路径
  • ACCESS_MODE:是以逗号分隔的选项列表,可以设置为:
    • rw:读写访问权限(默认)
    • ro:只读访问

(16)volumes_from

volumes_from:从另一个服务或容器挂载所有容器卷,可以选择指定只读访问(ro)或读写(rw)。如果未指定访问级别,则必须使用读写。

jsx
volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw

(17)working_dir

working_dir: 从 image 指定的目录覆盖容器的工作目录(即Dockerfile WORKDIR)。

3、顶级元素 Networks

networks:用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。 这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不同的网络类型。

在下面的示例中,在运行时,将创建网络前端和后端,并将前端服务连接到前端网络和后端网络。

jsx
services: frontend: image: awesome/webapp networks: - front-tier - back-tier networks: front-tier: back-tier:

4、顶级元素 Volumes

volumes:用于指引 Docker 来创建新的卷。

卷部分允许配置可跨多个服务重用的命名卷。下面是一个双服务设置的示例,其中数据库的数据目录作为名为 db-data 的卷与另一个服务共享,以便可以定期备份:

jsx
services: backend: image: awesome/database volumes: - db-data:/etc/data backup: image: backup-service volumes: - db-data:/var/lib/backup/data volumes: db-data:

五、compose 常用命令

命令说明
up创建和启动容器
down删除容器、网络、数据卷和镜像
build重新构建服务
ps列出容器
exec进入容器,在容器里面执行命令
top显示容器进程
logs查看容器日志
pause、unpause暂停、恢复整个项目所有服务或指定服务
rm删除整个项目或者指定服务
start、stop、restart开始、停止、重启整个项目所有服务或指定服务
ls列出正在运行的 compose 项目
version列出 compose 版本

1、up

为服务构建、(重新)创建、启动和附加到容器。该命令聚合每个容器的输出(像 does 一样)。当命令退出时,所有容器都将停止。-d 参数将在后台启动并运行容器。

jsx
# 语法 docker compose up [OPTIONS] [SERVICE...]

Options

选项描述
–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秒。

2、down

停止容器并删除 up 创建的容器、网络和镜像。

默认情况下,删除的东西只有:

  • 用于在 Compose 文件中定义的服务的容器。
  • 在 Compose 文件的 Networks 部分中定义的网络。
  • 默认网络(如果使用了一个网络)

注意:定义为外部的网络和卷永远不会被删除。默认情况下,不删除匿名卷。然而,由于它们没有一个稳定的名称,它们不会被后续的up自动挂载。对于需要在更新之间持久保存的数据,使用显式路径作为绑定挂载或命名卷。

jsx
# 语法 docker compose down [OPTIONS]

Options

选项描述
–remove-orphans删除未在 Compose 文件中定义的服务的容器。
–rmi删除服务使用的镜像。"local"只删除没有自定义标签的图片(“local”、“all”)
–timeout,-t指定以秒为单位的关机超时时间,默认为 10 秒。
–volumes,-v删除在 Compose 文件的 volumes 部分声明的命名卷和附加到容器的匿名卷。

3、build

用于构建或重新构建服务

jsx
# 语法 docker compose build [OPTIONS] [SERVICE...]

Options

选项描述
–build-arg为服务设置构建时变量。
–memory,-m为构建容器设置内存限制。
–no-cache在构建镜像时不使用缓存。
–progress设置进度输出类型(auto,tty, plain, quiet),默认为 auto。
–pull总是尝试拉出镜像的新版本。
–quiet,-q不要向STDOUT打印任何内容。
–ssh设置构建服务镜像时使用的SSH身份验证。(使用默认的SSH代理时使用’default’)

4、ps

列出Compose项目的容器,以及当前状态和公开的端口。默认情况下,运行和停止的容器都显示出来。

jsx
# 语法 docker compose ps [OPTIONS] [SERVICE...]

Options

选项描述
–all,-a显示所有已停止的容器(包括由run命令创建的容器)
–filter通过属性过滤服务,例如 status
–format格式化输出,可选格式:pretty 、 json
–quiet,-q只显示 id
–services显示服务
–status按状态过滤服务,可选状态:paused、restarting、removing、running、dead、created、exited

5、exec

在运行的容器中执行命令。这相当于针对 Compose 服务的 docker exec。通过这个子命令,您可以在服务中运行任意命令。默认情况下,命令会分配TTY,因此可以使用 docker compose exec web sh 等命令来获得交互式提示。

jsx
# 语法 docker compose exec [OPTIONS] SERVICE COMMAND [ARGS...]

Options

选项描述
–detach,-d分离模式,运行命令在后端。
–env,-e设置环境变量。
–index如果一个服务有多个实例,则使用容器的索引,默认值为 1 。
–interactive,-i保持STDIN打开,即使没有连接,默认值为 true 。
–user,-u以该用户运行该命令。
–workdir,-w此命令的 workdir 目录路径。

6、top

显示正在运行的进程。

jsx
# 语法 docker compose top [SERVICES...]

7、logs

查看容器的日志输出。

jsx
# 语法 docker compose logs [OPTIONS] [SERVICE...]

Options

选项描述
–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)

8、pause、unpause

暂停/取消暂停正在运行的服务容器。

jsx
# 暂停语法 docker compose pause [SERVICE...] # 取消暂停语法 docker compose unpause [SERVICE...]

9、rm

移除停止的服务容器

jsx
# 语法 docker compose rm [OPTIONS] [SERVICE...]

Options

选项描述
–force,-f不要询问是否要移除。
–stop,-s删除容器之前停止容器。
–volumes,-v删除连接到容器的所有匿名卷。

10、start、stop、restart

开始、停止、重启服务

jsx
# 开始服务 docker compose start [SERVICE...] # 停止服务 docker compose stop [SERVICE...] # 重启服务 docker compose restart [SERVICE...]

11、ls

列出正在运行的容器项目

jsx
# 语法 docker compose ls [OPTIONS]

Options

选项描述
–all,-a显示全部的 compose 项目。
–filter根据提供的条件筛选输出。
–format格式化输出,可选格式:pretty、json,默认为pretty。
–quiet,-q只显示 id。

12、version

显示Docker Compose版本信息

jsx
docker compose version [OPTIONS]

Options

选项描述
–format,-f格式化输出,可选格式:pretty、json,默认为pretty。
–short只显示Compose的版本号。

六、compose编排实例

(1)书写编排文件

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:

(2)编写完成docker-compose.yml后,进行语法检查:

bash
# 进行语法检查 docker-compose config -q

(3)如果语法检查没有任何问题,进行创建、启动:

bash
docker-compose up -d
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:LiuXueChao

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!