docker compose
- [什么是docker compose](#什么是docker compose)
- [为什么需要docker compose?](#为什么需要docker compose?)
- [docker compose 的功能](#docker compose 的功能)
- [docker compose 使用场景](#docker compose 使用场景)
- [docker compose 文件](#docker compose 文件)
- [docker compose常见命令](#docker compose常见命令)
-
- [docker compose up](#docker compose up)
- [docker compose down](#docker compose down)
- [docker compose run](#docker compose run)
- 基本操作练习
什么是docker compose
docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用;
docker compose 有两个比较重要的概念:
服务(service): 一个应用的容器,实际上可以包含若干个运行相同镜像的容器示例;
项目(project): 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义 ,整个docker-compose.yml定义一个项目;Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。通过 compose 可以方便的管理多个服务。
举个例子:就比如一个乐团:
一般对于一个乐团来说不是由一个人组成的,而是由弦乐 、管乐、 打击乐三大部分互相配合组成的,而对于每一个部分来说有时由具有相同演奏功能的人组成的,而指挥这三个部分奏出优美音乐的就是指挥家,指挥家会在合适的时候指挥这三个部分演奏自己的声音;
在docker compose中,指挥家就相当于docker-compose.yml文件,"弦乐 、管乐、 打击乐"这三个部分就相当整个项目中的服务,而这一个个的服务又是由具有相同功能的容器组成!
为什么需要docker compose?
举个例子:
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
这是一个启动mysql镜像所需要的启动参数,第一眼,参数很多、很麻烦;如果是启动一个mysql镜像还行,可是如果此时需要启动500个这样的mysql镜像,那么我们是不是要手动启动500次?那么既然是人为的启动,出错的概率是不是会大大的增加?同理,如果我们不需要这些容器了是不是也要stop500次?如果这时还交给人工来完成这个工作的话,那么会加大我们项目的不稳定性,我们需要一个能够自动完成这些工作的工具,docker compose应运而生!
docker compose 的功能
- 使用步骤:
1.1. 使用docker-compose-ymal定义构建应用程序的服务,这样他们可以在隔离环境中一起运行;
1.2. 最后执行docker compose up 命令来启动并运行整个应用程序;
- docker compose 是具备管理应用程序整个生命周期的命令:
2.1 启动、停止、重建服务;
2.2 查看正在运行的服务的状态;
2.3 流式传输运行服务的日志输出:
2.4 在服务上运行一次性命令;
docker compose 使用场景
- 单主机部署:
快速搭建一个单节点开发或者测试环境,方便使用;- 不同环境隔离:
通过指定project来运行不同的环境,实现隔离的目的;
docker compose 文件
文件语法版本:
目前官方支持三个大版本, 即 Version 1、Version 2 及 Version 3, 其中 Version 1 已经被废弃掉了。
当前最新的版本是 3.8,它支持的 Docker Engine 版本不得低于 19.03.0。
文件基本结构及常见标签
重要:
针对compose.ymal文件的标签详细信息,请参考官方文档;
文件基本结构:
yaml
version: 3.8 #定义当前docker compose.ymal文件所采用的语法版本
services: # 顶级标签,表示这个项目下的所有服务,也就是列举组成这个项目的具体服务:
serviceName1: # 具体服务的名称,他也是内部bridge网络可以使用的dns name,如果不是集群模式,那么就相当于docker run的时候指定的一个名称;
image: xxxx:tag # 必选,镜像的名字,可以是xxxx:tag模式,也可以是哈希摘要;
command: # 可选,如果设置,则会覆盖镜像里面的默认CMD启动命令;
environment: # 可选,设置环境变量;
volumes: # 设置存储卷
networks: # 指定当前容器加入的网络
ports: # 指定当前容器的映射端口
expose: # 可选,指定容器暴露的端口;
build: # 构建目录
depends_on: # 服务依赖配置
env_file: # 环境变量配置文件
serviceName2:
image:
command:
environment:
volumes:
serviceName3:
image:
command:
networks:
ports:
volumes: # 相当于docker volume create
networks: # 相当于docker network create
# 文件名:
docker-compose.yaml / docker-compose.yml
compose.yaml / compose.yml
# 任选其中一个即可
1. image标签
功能: 指定容器基于的镜像
演示:image: redis image: redis:5 image:redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7 image: library/redis image: docker.io/library/redis image: my_private.registry:5000/redis
2. command 标签
功能: 覆盖容器镜像默认声明的CMD
演示:
当然也可以写成数组的形式:
3. entrypoint
功能: 覆盖镜像默认的entrypoint进入点;
演示:
当然也可以写成一个列表的形式:
4. environment
功能: 给容器中设置环境变量
演示:map形式设置:
数组形式设置:
当env_file和environment中设置了相同的环境变量,environment优先;
5. networks
功能: 表示容器需要加入的网络;作为顶级域名使用的时候,可以指定创建的网络的类型、名称信息;
演示:普通用法:
顶级标签使用:
6. volumes:
功能: 指定容器挂载的存储卷
演示:作为普通标签使用:
作为顶级标签使用:
7. ports
功能: 映射容器的端口
演示:
8. expose
功能: 指定容器内,向外暴露的端口
演示:
9. depends_on
功能: 使用该标签,可以控制容器的启动顺序;
演示:
10. env_file
功能: 从文件中导入环境变量;
docker compose常见命令
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
docker-compose 命令的基本的使用格式为:
bashdocker compose [OPTIONS] COMMAND [ARGS...]
-f: 指定配置文件的位置,可以多次指定,但是多次指定的配置文件最终会合并成一个配置文件;如果后一个配置文件中和前一个配置文件中在同层具有相同标签,则会覆盖,否则则会新增;
-p: 指定项目名称;
指定项目名称除了使用-p选项,还有其它方式,优先级如下:
- docker compose -p
- 通过COMPOSE_PROJECT_NAME环境变量来设置
通过环境变量这个方式的具体操作又有三种:
2.1 在工作目录下创建一个.env文件,在这个文件中写入环境变量,每次执行docker compose命令的时候,都会自动读取这个文件;
2.2 通过docker compose 命令来设置:
2.3 通过shell 命令行来设置:
通过顶级标签:
name: xxx
来设置指定的配置文件的目录名
如果没有指定配置文件,那么就是当前目录名
注意:docker compose 系列的命令是针对于
.ymal
文件进行的,如果在工作目录下,那么针对docker compose 系列命令不需要使用-f 带上要操作的配置文件的路径;反之,则需要使用-f带上.ymal
配置文件的路径;对于docker compose 系列的命令于docker container系列的命令相差不大,只不过是从之前操作对象为单个docker转变为了操作对象为一个服务or一个项目!
docker compose up
语法 :docker compose up [OPTIONS] [SERVICE...]
功能: 构建镜像、创建容器、重新创建容器、启动容器并关联服务相关的一些操作。可以直接通过该命令来启动一个项目;
经试验发现,如果该命令什么参数都不带的情况下启动,那么它会查看.ymal
文件如果在这个文件中对应的服务存在容器,并且配置项没有改变,那么就会直接启动这个容器,不会新建容器;如果配置文件中某个服务的配置更改了,那么是需要重新创建容器在启动的,无论这个容器是否已经存在;
参数:
-d: 后台运行服务;
--force-recreate: 强制重新创建容器,不能与--no-recreate
同时使用;
--no-recreate: 如果容器已经存在,则不需要重新创建,直接启动容器,无论这个容器服务对应的配置文件是否修改!
实战:
首先来看看docker -compose.ymal
文件:
docker compose down
语法: docker compose down [OPTIONS] [SERVICES]
功能: 停止并删除容器、网络、存储卷以及创建出来的镜像;
默认会删除的东西有:
- 某个服务对应的容器;
- 在
.ymal
文件中创建的网络 - Docker Compose在默认情况下会创建一个名为default的网络,用于连接在同一个docker-compose.yml文件中定义的服务。除非在docker-compose.yml文件中明确指定了其他网络,否则服务会默认连接到这个default网络。当您运行docker-compose down时,这个默认的default网络(如果它被使用了)通常也会被移除,除非它被显式地标记为external或者通过其他方式被外部管理。
参数:
-v: 删除命名卷和匿名卷
--rmi:删除被服务使用的镜像,一般会有两个选项:local: 表示删除没有标签的镜像,比如: <none>:<none>
而all: 表示删除所有镜像
实战:
docker compose run
语法: docker compose run [OPTIONS] SERVICES [COMMAND] [ARGS...]
功能 :对服务运行一次性命令,简而言之就是启动SERVICES服务,并以COMMAND作为服务的启动命令;
如果服务未启动,那么该run命令会启动服务,并运行指定的命令;如果服务以及启动,那么该run命令会直接执行指定命令;
参数:
-d: 后台运行服务;
--name : 指定容器的名字
--entrypoint: 覆盖默认的容器启动指令
-e key=val: 设置环境变量;
-u :指定容器运行的用户名
--rm : 运行完命令过后自动删除容器;
-p:端口映射;
实战:
基本操作练习
- 创建compose目录:
- 进入project1目录,并创建docker-compose.ymal文件:
- 填写docker-compose.ymal文件的内容:
- 输入docker compose config命令,会自动解析我们写的ymal文件,并会进行语法检查:
- 进入web服务绑定的目录,修改index.html文件:
- 启动服务
- 通过网页访问:
- 停止服务:
- 重新启动服务:
- 释放资源: