在前面的介绍中我们都是以单个容器为例来进行演示。但在实际的生产环境中,一个应用往往会有多个组件,并分别运行在不同的容器。在这种多容器的场景下,使用Docker客户端进行管理会存在较大的不便利性。
基于这类场景,Docker官方提供了一个多容器的管理工具 Docker Compose。它是一个Python开发的工具,可对具有多个容器的应用进行操作,从而实现快速高效的管理。
本文将对Docker Compose相关的使用方法进行讲解介绍。
一. 部署安装
Compose作为一个独立的工具,本身并没有与Docker客户端进行集成 ,需要单独安装。(注:在安装之前,主机上必须先安装好Docker引擎)
Compose的部署安装有RPM包、二进制、脚本安装等几种方式,本文将演示RPM包与二进制的安装操作。
1. RPM包安装
$ yum install -y docker-compose-plugin
$ docker compose version
Docker Compose version v2.6.0
2. 二进制文件安装
$ mkdir -p /usr/local/lib/docker/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo chomd +x /usr/local/lib/docker/cli-plugins/docker-compose
$ docker compose version
Docker Compose version v2.6.0
二. 模板文件
Docker Compose使用基于yml格式的模板文件来定义应用,默认的模板文件名称为docker-compose.yml。
我们先来了解一下模板的格式 ,如下是一个模板示例,它定义了两个应用服务。
version: "3.9"
services:
myapp:
build: ./myapp
ports:
- "80:80"
container_name: myapp
depends_on:
- database
networks:
- mynet
database:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
container_name: db
volumes:
- "mydata:/var/lib/mysql"
networks:
- mynet
networks:
mynet:
driver: bridge
volumes:
mydata:
下面我们根据模板的各个功能参数来进行拆分讲解:
version
定义了Compose文件使用的API版本(并非Compose产品自身版本),一般建议使用最新的版本,此处使用3.9。
services
用于定义不同的应用服务,此处定义了两个服务:web和database。Docker Compose会将每个服务部署在各自的容器中。
build
指定Dockerfile所在文件夹的路径(可支持绝对路径或相对路径),Compose 会使用它来构建镜像,该镜像会被用于启动该服务的容器。
ports
指定Docker容器的端口映射到主机,该功能与docker run 启动容器的 -p 选项一样,格式为“主机端口:容器端口”。如果只指定了容器端口,那么主机端口将使用随机端口。
container_name
用于指定容器名称,如果不指定的话,则默认会使用“目录名+服务名+序号”这样的格式来表示。
depends_on
指定服务间的依赖关系。如本例所示,由于myapp依赖于database服务,所以Docker Compose会先启动database服务对应的容器,然后再进行myapp的启动。
networks
一级的networks参数用于指定创建服务所使用的网络,此处指定名称为mynet,Compose会在该名称前面再加上目录名称作为创建的网络名称,格式为“目录名_mynet”。网络驱动使用bridge,表明这是一个bridge网络。
services 项中的服务使用networks用于指定加入的网络,此处都使用mynet网络。
image
指定服务使用的镜像。本示例中的database服务使用mysql:5.7的镜像,Compose会自动下载该镜像用于启动容器。
environment
设置环境变量,该变量会在容器启动时自动加载。如果只指定了变量名称,则会自动获取Compose主机上对应变量的值,这种方式可用来防止重要数据的泄漏。
示例:
volumes
指定容器挂载的数据卷,可以使用目录挂载或volumes挂载。
示例:目录挂载
volumes:
- "/data/mysql:/var/lib/mysql"
示例:volumes挂载
volumes:
- mydata:/var/lib/mysql
volumes:
mydata:
除了以上这些常用的参数外,Docker Compose还有不少其他的参数可以使用,限于篇幅原因在此不做过多介绍,有兴趣的读者可自己查看相关资料。
三. 管理应用
Docker Compose在新的版本中,使用的命令格式与其他docker 命令类似,为“ docker compose + 选项 + [参数]”。原有的“docker-compose 命令不再使用。
1. 查看帮助
执行"docker compose --help" 可查看命令的详细介绍
$ docker compose --help
......
Commands:
build Build or rebuild services
convert Converts the compose file to platform's canonical format
cp Copy files/folders between a service container and the local filesystem
create Creates containers for a service.
down Stop and remove containers, networks
events Receive real time events from containers.
exec Execute a command in a running container.
images List images used by the created containers
kill Force stop service containers.
logs View output from containers
......
2. 构建镜像
使用docker compose build 命令可用于构建项目中镜像,我们可以使用此命令先提前准备好相关的镜像。否则 ,相关镜像将在启动服务时进行构建。
$ docker compose build
[+] Building 3.3s (2/3)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 92B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.7-alpine
......
构建完成后,我们可以看到镜像已经生成,镜像名称格式为“目录名+服务名”。
$ docker compose images
Container Repository Tag Image Id Size
myapp test_myapp latest fda100c4b2ae 51.6MB
3. 服务创建并启动
使用docker compose up 命令可启动docker-compose.yml 模板文件中定义的服务,通常会在命令后面加上 -d ,用于后台启动。该命令会构建所需的镜像、创建网络和存储卷、然后进行容器的启动等操作。
由于前面已提前构建好myapp的镜像,故这里只需要拉取database的镜像,并创建相关的容器资源即可。
$ docker compose up -d
[+] Running 12/12
⠿ database Pulled 98.0s
⠿ 72a69066d2fe Pull complete 35.4s
⠿ 93619dbc5b36 Pull complete 35.5s
⠿ 99da31dd6142 Pull complete 35.7s
⠿ 626033c43d70 Pull complete 35.9s
⠿ 37d5d7efb64e Pull complete 35.9s
⠿ ac563158d721 Pull complete 36.8s
⠿ d2ba16033dad Pull complete 36.9s
⠿ 0ceb82207cd7 Pull complete 36.9s
⠿ 37f2405cae96 Pull complete 80.7s
⠿ e2482e017e53 Pull complete 80.7s
⠿ 70deed891d42 Pull complete 80.8s
[+] Running 4/4
⠿ Network test_mynet Created 0.2s
⠿ Volume "test_mydata" Created 0.0s
⠿ Container db Started 0.5s
⠿ Container myapp Started
查看容器状态,可看到服务容器已正常启动。
docker compose ps
NAME COMMAND SERVICE STATUS PORTS
db "docker-entrypoint.s…" database running 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
myapp "python /opt/myapp/m…" myapp running 0.0.0.0:80->80/tcp, :::80->80/tcp
4. 停止/启动服务
使用docker compose stop/start 命令可对服务相关的容器进行停止/启动。
停止服务
$ docker compose stop
[+] Running 2/2
⠿ Container myapp Stopped 10.2s
⠿ Container db Stopped
启动服务
$ docker compose start
[+] Running 2/2
⠿ Container db Started 0.4s
⠿ Container myapp Started
5. 服务下线
使用docker compose down 会将服务相关的容器与网络进行停止并清理删除,只保留镜像、存储卷等资源。
$ docker compose down
[+] Running 3/3
⠿ Container myapp Removed 10.2s
⠿ Container db Removed 1.9s
⠿ Network test_mynet Removed
专注于Devops、SRE、运维开发等技术分享,扫码关注公众号,获取更多精彩内容!