Docker Compose 的简明使用

image-20230415233342204

使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。

简介

compose、machine 和 swarm 是docker 原生提供的三大编排工具。简称docker三剑客。

Docker Compose能够在 Docker 节点上,以单引擎模式(Single-Engine Mode)进行多容器应用的部 署和管理。多数的现代应用通过多个更小的微服务互相协同来组成一个完整可用的应用。

部署和管理繁多的服务是困难的。而这正是 Docker Compose 要解决的问题。Docker Compose 并不 是通过脚本和各种冗长的 docker 命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整 个应用,从而使用一条命令完成部署。

应用部署成功后,还可以通过一系列简单的命令实现对其完整声 明周期的管理。甚至,配置文件还可以置于版本控制系统中进行存储和管理。

docker-compose 安装

从 compose v2 开始,docker-compose 的指令大部分已经集成到了 docker 中,可以通过 docker compose(而不是 docker-compose)来使用。

如果要使用 docker-compose,则需要单独安装程序,方法如下:

使用 scoop 安装 docker-compose

1
scoop install docker-compose

yml 配置文件

Docker Compose 使用 YAML 文件来定义多服务的应用。YAML 是 JSON 的一个子集,因此也可以使用JSON。

Docker Compose 默认使用文件名 compose.yaml。当然,也可以使用 -f 参数指定具体文件。

docker-compose 按以下顺序使用配置文件:

compose.yaml compose.yml docker-compose.yaml docker-compose.yml compose.yaml

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# compose 文件 API 的版本号
version: '3.9'

# 服务
services:
# mysql
  mysql:
  # 指定镜像名称
  image: mysql/mysql:5.7
  # 重启方式
  restart: always
  # 容器名称
  container_name: mysql57
  # 端口映射 本机:容器
  ports:
- 3306:3306
# 挂载卷 本机:容器
  volumes:
    - /data/edu-bom/mysql/test:/var/lib/mysql
    build:
      context: ./mysql
    environment:
    # 设置 root 密码
      MYSQL_ROOT_PASSWORD: admin
    networks:
      net:
  eureka:
    build:
      context: ./edu-eureka-boot
    restart: always
    ports:
      - 8761:8761
    container_name: edu-eureka-boot
    hostname: edu-eureka-boot
    image: edu/edu-eureka-boot:1.0
    depends_on:
      - mysql57
    networks:
      net:
networks:
net:
volumes:
vol:

顶层元素

image-20230415233342204

Docker Compose 的 YAML 文件包含 6 个顶层元素,分别是:version、services、networks、volumes、configs、secrets。

version

version 截止目前(2023-04-15)已经弃用。它应总是位于文件的第一行。它定义了 Compose 文件格式(主要是 API)的版本。注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。

指定要使用的 Compose 文件版本时,请确保同时指定主要版本号和次要版本号。如果没有给出次要版本, 0则默认使用而不是最新的次要版本。

Docker Engine 支持的 Compose 文件版本如下:

Compose file format Docker Engine release
Compose specification 19.03.0+
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+

services

services 用于定义不同的应用服务。上边的例子定义了两个服务:一个名为 lagou-mysql数据库服 务以及一个名为lagou-eureka的微服。Docker Compose 会将每个服务部署在各自的容器中。

service 中很多配置项,下面根据日常使用的一致频率来分别进行介绍。

image

指定 image 名称。

build

指定 Dockfile 所在的文件位置,可以是绝对位置或者相对位置,Compose 会自动利用这路径下的 Dockfile 来自动构建出image,然后使用该 image 进行容器的设定。

使用默认文件名:

1
2
3
4
version: "3.9"
services:
webapp:
build: ./dir #直接指定路径,前提要 dockfile 文件名刚好是 Dockerfile

使用自定义文件名:

1
2
3
4
5
6
7
8
version: "3.9"
services:
webapp:
build:
context: ./dir #透过 context 来指定路径
dockerfile: Dockerfile-alternate #说明要执行编译的 Dockfile 文件名
args: # 指定编译 image 时,所需要的 arguments
buildno: 1

command

用来覆盖容器启动后默认执行的动作。

expose

开放 port 给 container 连线,但没有映射到 host 上

1
2
3
expose:
- "3000"
- "8000"

ports

将 port 绑定在 host 上,然后就能在 host 的环境,与容器做交互

depends_on

当使用 docker-compose up 时,依照依赖顺序来启动。

当使用 docker-compose stop 时,依照依赖顺序的反序来关闭容器。

只是启动顺序,但是不会等待容器的状态到 Ready

如果要等待,可以使用 vishnubob/wait-for-iteficode/wait-for 来实现

networks

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

1
2
3
4
5
6
7
8
9
10
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier

networks:
front-tier:
back-tier:

volumes

顶层的 volumes 为所有的服务提供公共的挂载卷,方便其它服务通过该位置进行共享和备份。

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
backend:
image: awesome/database
volumes:
- db-data:/etc/data

backup:
image: backup-service
volumes:
- db-data:/var/lib/backup/data

volumes:
db-data:

常用命令

build

docker-compose build [options] [SERVICE...]

重新 build 该项目所有 service 的 image

--force-rm 删除临时容器

--no-cache 就不用cache

--pull 尝试拉取最新的image版本

config

验证 compose 文件格式,错误会显示错误原因

up

docker-compose up [options] [SERVICE...]

等于一整组的动作,重新 create container,start container,link each

-d 将在后台运行

--scale SERVICE_NAME=NUM,用来水平伸缩指定service的数量

stop

docker-compose stop [options] [SERVICE...]

停止状态是 running 的容器

rm

docker-compose rm [options] [SERVICE...]

会删除所有状态是 stopped 的容器,所以建议事先使用上面的stop 来停止容器后再进行删除

ps

docker-compose ps [options] [SERVICE...]

列出容器清单

logs

docker-compose logs [options] [SERVICE...]

如果没指定 service name,则把所有 service 的 log 都输出

参考

docker compose 官方文档

全网最详细的Docker-Compose详细教程