使用docker-compose编排容器
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。
1、Docker-compose 定义
1)docker compose 是 docker 官⽅的开源项⽬,负责实现对 docker 容器集群的快速编排(容器,依赖,⽹络,挂载。。)
2)compose 是 docker 公司推出的⼀个⼯具软件,可以管理多个 docker 容器组成的应⽤
3) 需要定义⼀个 YAML 格式的配置⽂件 docker-compose.yml,写 好多个容器之间的调⽤关系
4)使⽤ compose 的步骤
使⽤ Dockerfile 定义各个微服务应⽤并构建出对应的镜像⽂件Dockerfile 的使⽤,以便可以在任何地⽅复制。
使⽤ docker-compose.yml 定义⼀个完整的业务单元,安排好整体应⽤中的各个容器服务。
最后,执⾏ docker-compose up 命令来启动并运⾏整个应⽤程序,完成⼀键部署。
2、Docker-compose 产⽣背景
1)使⽤ Dockerfile 定义镜像⽂件,再⼿动构建、运⾏容器等操作,⽽微服务架构⼀般包含若⼲个微服务,且每个微服务⼀般都会部署多个实例,所以,若每个微服务都需要⼿动启停,那么维护量会⾮常庞⼤,并且⼯作效率也会很低。
2)⽽ compose 是⽤于定义和运⾏多容器 docker 应⽤程序的⼯具。通过 compose,可以使⽤ YML ⽂件来配置应⽤程序需要的所有服务。
3)仅需使⽤⼀个命令,就可以从 YML ⽂件配置中创建并启动所有 服务。
4)Compose 可以基于 Compose ⽂件帮我们快速的部署分布式应 ⽤,⽆需⼿动⼀个个创建和运⾏容器。
5)Compose ⽂件是⼀个⽂本⽂件,通过指令定义集群中的每个容 器如何运⾏。
3、Docker-compose 核⼼概念
Docker-compose 将管理的容器分为三层:⼯程(project)、 服务(service)、容器(container)
1、⼯程:运⾏ compose 的⽬录下所有的⽂件,包括 docker-compose.yml、extends ⽂件、环境变量⽂件等组成⼀个⼯程, 若⽆特殊指定⼯程,⼯程名即为当前⽬录名。⼯程的默认配置⽂件为 docker-compose.yml,可通过环境变量 COMPOSE_FILE 或 -f 参数⾃定义配置⽂件,其定义了多个有依赖关系的服务及每个服务运⾏的容器。
2、 服务:⼀个⼯程中包含多个服务,每个服务中定义了容器运⾏的 镜像、参数、依赖等。⼀个服务中可包括多个容器实例。
3、容器:被 docker-compose 管理或部署的容器集群,调⽤ docker 服务提供的 API 来对容器进⾏管理,只要操作的平台⽀持 docker API,即可在其上进⾏ compose 的容器编排。
4、YAML ⽂件的格式和语法
1)YAML ⽂件格式
yaml 是⼀种标记语⾔很直观的数据序列化格式,可读性很⾼。 类似于 xml 描述性语⾔,语法⽐xml简单的很多。
yaml 数据结构通过缩进进⾏表示,连续的项⽬通过减号来表示,键值对⽤冒号分隔,数组⽤中括号括起来,hash⽤花括号括起来。
yaml ⽂件的基本格式由⼀系列键值对构成。每个键值对都⽤冒号“: ”分隔
key: value
在 yaml 中,键和值之间只需要⼀个空格,这是为了保证 yaml ⽂件的可读性和⼀致性
对于字符串值,可以使⽤单引号或者双引号将其括起来,这样可以避免出现特殊字符或空格等问题
name: 'Meng Mr'
age: "34"
如果值包含特殊字符(如冒号或短横线),则应该使⽤引号将其括起来
description: "This is a YAML file: good for configuation files."
2)YAML 注意事项
不⽀持制表符 tab 键缩进,需要使⽤空格缩进。
通常开头缩进 2 个空格。
字符后缩进 1 个空格,如:冒号,逗号,横杠。
⽤ # 表示注释。
如果包含特殊字符⽤单引号引起来。
布尔值(true、false、yes、no、on、off)必须使⽤“”引号括起来,这样分析器会将它们解释为字符串。
3)列表和数组
在yaml中,可以使⽤“-”符号表示⼀个列表和数组
fruits: # fruits是⼀个键,它对应⼀个列表,包含三个元素:apple、banana、orange
- apple # fruits为⼀个⼤项,下⾯的⼩项只需要缩进⼏个
空格,与其他项⽬对⻬即可
- banana
- orange
4)嵌套数据结构
yaml⽀持嵌套数据结构,可以⽤缩进来表示不同层级之间的关系, 可使⽤ # 号表示注释信息。
person:
name: 'Meng Mr' # 两个空格,name和age是person的⼀级⼦节点
age: "34"
address: # address是person的⼆级⼦节点
street: '123 Main St' # address节点包含了street、city、state和zip四个⼀级⼦节点
city: 'Anytown'
state: 'CA'
zip: '12345'
5)Docker-compose 安装
使用pip工具-------安装docker-compose
pip是python的包管理工具,和yum是redhat的关系是一样的
# 由于要使用python环境运行docker-compose,所以需要验证python
[root@docker1 ~]# python --version
Python 2.7.5
[root@docker1 ~]# pip
-bash: pip: 未找到命令
# 安装pip,python的包管理工具(需要使用pip下载安装docker-compose)
[root@docker1 ~]# yum -y install python2-pip
# 查看所有已经安装过的python第三方库,发现pip版本太低
[root@docker1 ~]# pip list
pip (8.1.2)
# 升级pip版本
[root@docker1 ~]# pip install --upgrade pip
安装失败
[root@docker1 ~]# pip install --upgrade pip==20.3 -i https://mirrors.aliyun.com/pypi/simple
Successfully installed pip-20.3
[root@docker1 ~]# pip list
pip 20.3
# 使用pip安装docker-compose
[root@docker1 ~]# pip install docker-compose --ignore-installed requests -i https://mirrors.aliyun.com/pypi/simple
[root@docker1 ~]# pip list
docker-compose 1.26.2
# 配置docker
[root@docker1 ~]# sh docker.sh
[root@docker1 ~]# docker --version
Docker version 26.1.4, build 5650f9b
6)docker-compose 命令解析
1、⽂件内常⽤指令字段
(1)version
指定了Docker compose编排⽂件的版本 Docker Compose ⽬前有三个版本,分别为 Version1、 Version2和Version3。
Version1 是较早的版本,它将来会被弃⽤。
Version2 是⽬前的稳定版本,⽀持更多的指令。
Version3 在功能上与 Version2 类似,但进⾏了⼀些改进和 扩展,例如增加了对 Docker BuildKit 的⽀持,可以加速构建过程。
version:'3'
(2)service
指定了在 docker compose 编排中要运⾏的服务,每个服务都有⼀ 个名称,并指定要使⽤的镜像和容器的配置选项。
services:
mysql: #服务名
# 再往下可以对该服务进⾏定义,⽐如指定映射端⼝,指定使⽤的镜像等,但要注意缩进格式。
(3)image
指定要使用的docker镜像
services:
mysql: # 服务名
image: mysql:5.5 # 指定mysql镜像,如果主机内不存在该镜像,会从登录的docker镜像仓库内拉取,⼀般都是从dockerhub上拉取
(4)build
允许在 docker compose 编排中指定 dockerfile 的位置。
services:
mysql: # 服务名
build: /docker/mysql # 这⾥为⽤户微服务⽂件夹,⾥⾯存放的是该服务代码jar包和Dockerfile⽂件
(5)environment
指定了要设置的环境变量。
services:
mysql: # 服务名
environment: # 下⾯是MySQL环境变量的例⼦
MYSQL_ROOT_PASSWORD: 000000 # 设置MySQL的root⽤户的密码
MYSQL_DATABASE: database # 指定要创建的数据库名称
MYSQL_USER: user # 指定要创建的MySQL⽤户名
MYSQL_PASSWORD: 123 # 指定要创建的MySQL⽤户的密码
(6)volumes
挂载宿主机路径或命名卷
1、指定路径挂载
services:
mysql: # 服务名