2.Docker Compose定义在实际部署某个项目时,该项目一般包括多个微服务(比如mysql、redis等等),如果仅仅使用Docker原生当时来部署容器,则每个服务都要手动启动、维护、连接,对于大型项目部署或者项目迁移来说,效率十分低下,维护十分困难,因此需要一个帮助我们快速管理、编排多容器服务的工具----Docker Compose
3.Docker Compose原理Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。
注意,Docker Compose的定位只是简单的编排多容器服务,更复杂的比如资源分配、资源调度这些是做不到的,要实现这些就需要k8s的支持。
4.Docker Compose核心概念Docker Compose的核心是模板文件,Compose通过用户构建的Compose模板文件来实现快速编排容器服务,模板文件中包含了大量构建项目容器服务相关的命令。通过执行docker-compose指令,Docker Compose会自动解析模板文件,并调用 Docker 服务提供的 API 来实现多容器的快速编排(类似于执行一个写好的“脚本”)。
二.Docker Compose 环境配置 1.Docker Compose安装Compose 中有两个重要的概念:
服务 (service):一个提供特定应用的容器,服务可以存在多个。
项目 (project):由一组关联的应用容器(服务)组成的一个完整业务单元,在模板文件中定义。
Compose 的默认管理对象(单位)是项目,每一个模板文件都默认代表一个完整的项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose #查看compose版本,验证安装是否成功 $ docker-compose version
2.Docker Compose命令说明说明:
- 第一条命令:下载docker compose 1.29.2版本,并放到/usr/local/bin/下,原因是/usr/local/bin/目录默认配置了环境变量,我们可以直接在任何地方使用相关命令
- 第二条命令:修改docker-compose的操作权限
docker-compose 命令的基本的使用格式是:docker-compose [-f=...] [options] [COMMAND] [ARGS...],其选项说明如下
(1)[options]:
- -f : 指定使用的 Compose 模板文件(可为相对路径或绝对路径),默认为当前目录下的 docker-compose.yml,可以多次指定
- -p: 指定项目名称,默认将使用所在目录名称作为项目名。
(2)[COMMAND]:
- up
- down
- ps
- logs
(3)注意:所有COMMAND的使用都有以下三种情况(必须指明compose文件的位置):
- 默认compose文件名且处在当前docker-compose.yml同目录下:直接使用docker-compose [command] 即可
- 默认compose文件名且未处在当前docker-compose.yml同目录下:使用docker-compose -f 文件目录 [command] 或 移动到同目录下再执行
- 自定义compose文件名:使用docker-compose -f 文件目录 [command] 执行命令
(1)up
格式为 docker-compose up [options] [SERVICE...]。该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。注意:当通过 Ctrl-C 停止命令时,所有容器将会停止。
[options]:
- -d :在后台运行服务容器。docker-compose up -d(默认文件名)
- -no-color: 不使用颜色来区分不同的服务的控制台输出。
(2)down
此命令将会停止并移除 up 命令所启动的容器,并移除内部网络,数据卷将被保留下来。
- 默认文件名(同目录下):docker-compose down
- 自定义文件:docker-compose -f /root/hello/demo-compose.yml down
(3)ps
格式为 docker-compose ps [options] [SERVICE...]。列出项目中目前的所有容器服务。
[options]:
- -q :只打印容器的 ID 信息。
(4)logs
三.Docker Compose模板文件格式为 docker-compose logs [options] [SERVICE...]。查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
模板文件是使用 `Compose` 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 `docker run` 相关参数的含义都是类似的。默认的模板文件名称应为 docker-compose.yml,格式为 YAML 格式。 模板文件的格式如下:
version: "3.9" #指定Compse版本
services: #配置项目依赖的多个服务
prject1_Name: #服务一的名称
#配置该服务的启动信息
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
project2_Name: #服务二的名称
#配置该服务的启动信息
...
其他公共配置信息(比如网桥、数据卷等):
1. image注意:每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。下面分别介绍各个指令的用法。
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试远程拉取这个镜像。该指令相当于dcker run image中的指定镜像。
image: centos:7 image: a4bc65fd2.container_name
指定服务启动的容器名称。若不指定则默认将会使用 项目名称_服务名称_序号 这样的格式。该指令相当于dcker run 中的 --name 指定容器名称。注意:
- 容器名称 != 服务名称,服务名称是唯一的,容器名称也是唯一的,每个服务通过相应的容器来提供功能。
- 项目名称 默认为docker-compse.yml所在目录的名称,视为一个完整的项目
version: "3.9"
services:
prject1_Name:
image: tomcat:8.0-jre #镜像信息
cntainer_name: tomcat01 #容器名称
3.ports
暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。该指令相当于dcker run 中的 -p 指定端口映射。注意:建议数字串都采用引号包括起来的字符串格式。
ports: #yml数组格式(可以映射多个端口)
- "3000"
- "8000:8000"
- "49100:22"
4.volumes
数据卷所挂载路径设置,可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。该指令相当于dcker run 中的 -v 指定数据卷。
- 宿主机路径挂载:HOST:CONTAINER格式,使用自定义路径映射数据卷
- 内部数据卷名称挂载:VOLUME:CONTAINER格式,需要在volumes配置中声明该数据卷,数据卷将以 项目名_数据卷名 的方式自动创建。
- 外部数据卷名称挂载:VOLUME:CONTAINER格式,需要在volumes配置中声明该数据卷并将external声明为true,该外部数据卷必须在启动之前存在。
# 1.自定义路径挂载
version: "3.9"
services:
tomcat:
image: tomcat:8.0-jre
#yml数组格式(可挂载多组数据卷)
volumes:
- /root/apps:/usr/local/tomcat/webapps
# 2.内部数据卷名称挂载
version: "3.9"
services:
tomcat:
image: tomcat:8.0-jre
#yml数组格式(可挂载多组数据卷)
volumes:
- tomcat_data01:/usr/local/tomcat/webapps
#声明上面服务所使用的自动创建数据卷名
volumes:
#compse自动创建数据卷,以项目名_tomcat_data01格式
tomcat_data01:
# 3.外部数据卷名称挂载
version: "3.9"
services:
tomcat:
image: tomcat:8.0-jre
volumes:
- tomcat_data01:/usr/local/tomcat/webapps
#声明上面服务所使用的数据卷名
volumes:
#使用external为true声明数据卷来自外部,引用外部名为tomcat_data01的数据卷(必须存在)
tomcat_data01:
external:
true
5.networks
配置容器连接的网络设置,通过网桥名称指定容器服务绑定的网络;若不指定,则容器默认连接bridge网桥。该指令相当于dcker run 中的 --network 指定所用网桥。注意该命令指定的网桥名称必须在networks配置中进行声明。
- 自动创建网桥:需要在networks 配置中声明该网桥名称,网桥将以 项目名_网桥名 的方式自动创建。
- 使用外部网桥:需要在networks 配置中声明该网桥名称,并将external声明为true,该外部网桥必须在启动之前存在。
# 1.自动创建网桥
version: "3.9"
services:
tomcat:
image: tomcat:8.0-jre
#yml数组格式,可以连接到多个网桥
networks:
- hello
#声明上面服务所使用的网桥
networks:
#compse自动创建网桥,以项目名_hello格式
hello:
# 2.使用外部网桥
version: "3.9"
services:
tomcat:
image: tomcat:8.0-jre
#yml数组格式,可以连接多个网桥
networks:
- hello
#声明上面服务所使用的网桥
networks:
#external为true声明外部网桥,网桥必须存在
hello:
external:
true
6.environment
设置环境变量。可以使用数组(- key=value)或字典(key:value)两种格式。只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。该指令相当于dcker run 中的 -e 指定环境变量。
#字典形式 environment: RACK_ENV: development SESSION_SECRET: #数组形式 environment: - RACK_ENV=development - SESSION_SECRET
version: "3.9"
services:
mysql:
image: mysql:5.7
container_name: mysql01
ports:
- "3308:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
#数组形式设置环境变量(可以多组)
environment:
- MYSQL_ROOT_PASSWORD=root
#声明上面服务所使用的自动创建数据卷名
volumes:
mysqldata:
mysqlconf:
7.env_file
从文件(.env格式)中获取环境变量,可以为单独的文件路径或列表。环境变量文件中每一行必须符合key=value格式,支持 # 开头的注释行。该指令将环境变量赋值转移到文件中,提高了安全性。注意:
- env_file变量,可以使用相对路径,也可以使用绝对路径指定环境变量文件位置
- 如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
version: "3.9"
services:
mysql:
image: mysql:5.7
container_name: mysql01
ports:
- "3308:3306"
#声明变量文件(yml数组格式,可以有多组文件)
env_file:
- mysql.env #相对路径(相对于docker-compse.yml)
- /opt/secrets.env #绝对路径
8.depends_on
用于指定各服务容器之间的依赖关系,解决容器的启动先后问题。依赖的服务会在当前服务之前优先启动。该指令相当于 手动启动容器的顺序。注意:
- 当前服务不会等待依赖服务 「完全启动」之后才启动,只要依赖服务启动到一定当前服务可接受的程度,当前服务就会随之启动。
- depends_on后面书写 服务id|服务名 , 而不是容器名
version: "3.9"
services:
tomcat:
image: tomcat:8.0-jre
container_name: tomcat01
ports:
- "8089:8080"
volumes:
- tomcat_data01:/usr/local/tomcat/webapps
networks:
- hello
#yml数组格式(可指定多个依赖服务)
depends_on:
- mysql #这里是服务名!
mysql:
image: mysql:5.7
container_name: mysql01
ports:
- "3308:3306"
volumes:
- mysqldata:/var/lib/mysql
- mysqlconf:/etc/mysql
env_file:
- mysql.env
environment:
- MYSQL_ROOT_PASSWORD=root
networks:
- hello
#声明上面服务所使用的自动创建数据卷名
volumes:
tomcat_data01:
mysqldata:
mysqlconf:
#声明上面服务所使用的网桥
networks:
hello:
9.command
覆盖容器启动后默认执行的命令。该指令相当于 dockerfile 的 CMD
command: echo "hello world"10.build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的相对路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像运行容器服务。 注意:
- 如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。
- image 与 build 存在一个即可。
version: "3.9"
services:
tomcat:
#使用dockerfile构建镜像和运行容器
build:
context: /root/apps #指定dockerfile上下文目录(dockerfile所在目录)
dockerfile: Dockerfile-alternate #指定dockerfile文件名称
container_name: tomcat01
ports:
- "8089:8080"
volumes:
- tomcat_data01:/usr/local/tomcat/webapps
networks:
- hello
11.其他
- healthcheck : 心跳检测,通过命令检查容器是否健康运行。
- sysctls : 配置容器的系统内核参数
- ulimits :指定容器的最大进程数限制



