九、安装Docker Compose 编排工具
微服务架构中:涉及的服务数量巨多。
虽然使用上述方式可以部署微服务项目,但考虑到微服务项目可能有多个子服务组成, 并且每个服务启动过程中都需要配置额外的参数(如-e配置环境变量、--network指定网 络、磁盘挂载等等)。这种情况下,每次更新微服务后,都要手动运行指令来重新启动 容器,这就显得相当麻烦了。针对这种多服务部署的情况,Docker提供了Docker Compose编排工具来对多服务应用进行统一部署。Compose是Docker的服务编排工 具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个 Docker容器,非常适合组合使用多个容器进行开发的场景。
通过该编排工具,可以使用yml(或yaml)文件来配置应用程序服务,然后只需要一条简 单的服务部署指令就可以从配置中创建并启动所有服务。
1. Yaml 语法
YAML 是 "YAML An't Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
非常适合用来做以数据为中心的配置文件
基本语法
-
key: value;kv之间有空格
-
大小写敏感
-
使用缩进表示层级关系
-
缩进不允许使用tab,只允许空格
-
缩进的空格数不重要,只要相同层级的元素左对齐即可
-
'#'表示注释
-
字符串无需加引号,如果要加,''与""表示字符串内容 会被 转义/不转义
数据类型
-
字面量:单个的、不可再分的值。date、boolean、string、number、null
k: v
-
对象:键值对的集合。map(Dictionary<T>)、hash(HashTable)、set(HashSet<T>)、object
行内写法: k: {k1:v1,k2:v2,k3:v3} #或 k: k1: v1 k2: v2 k3: v3
-
数组:一组按次序排列的值。array、list、queue
行内写法: k: [v1,v2,v3] #或者 k: - v1 - v2 - v3
Java 示例
@Data
public class Person {
private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private Pet pet;
private String[] interests;
private List<String> animal;
private Map<String, Object> score;
private Set<Double> salarys;
private Map<String, List<Pet>> allPets;
}
@Data
public class Pet {
private String name;
private Double weight;
}
.Net 示例
public class Person {
public String UserName { get; set; }
public bool Boss { get; set; }
public DateTime Birth { get; set; }
public int Age { get; set; }
public Pet PersonPet { get; set; }
public String[] Interests { get; set; }
public List<String> Animal { get; set; }
public Dictionary<String, Object> Score { get; set; }
public HashSet<Double> Salarys { get; set; }
public Dictionary<String, List<Pet>> AllPets { get; set; }
}
public class Pet {
public String Name { get; set; }
public Double Weight { get; set; }
}
yaml表示以上对象
person: userName: zhangsan boss: false birth: 2019/12/12 20:12:33 age: 18 pet: name: tomcat weight: 23.4 interests: [篮球,游泳] animal: - jerry - mario score: english: first: 30 second: 40 third: 50 math: [131,140,148] chinese: {first: 128,second: 136} salarys: [3999,4999.98,5999.99] allPets: sick: - {name: tom} - {name: jerry,weight: 47} health: [{name: mario,weight: 47}]
2. 安装与卸载
前提条件:docker 版本不能低于docker 18
-
从github上下载docker-compose二进制文件安装
curl -L https://github.com/docker/compose/releases/download/1.27.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
若是github访问太慢,可以用daocloud下载
curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加可执行权限
-
sudo chmod +x /usr/local/bin/docker-compose
-
测试安装结果
$ docker-compose --version
卸载
rm /usr/local/bin/docker-compose
3. docker compose使用
步骤:分为三步(在创建的一个空目录下执行)
1、编写Dockerfile文件(为每个服务构建需要的镜像,方便迁移‐不是必须的)
2、编写docker‐compose.yml文件(编写部署服务相关指令)
3、运行docker‐compose up(启动yml文件中服务)
案例:
1、准备:redis:7.0.5 镜像
$ docker pull redis:5.7
2、需要新建一个空白目录,例如rwtest。新建一个docker‐compose.yml,编辑该文件:
version: '3' services: redis: image: redis:7.0.5 ports: - 6379:6379 container_name: redis networks: - mynetwork networks: mynetwork:
该文件中内容:新建db和wordpress容器。等同于:
$ docker run -d --name redis --net mynetwork -p 6379:6379 redis:7.0.5
3、启动docker compose
$ docker‐compose up -d
5、停止/重启服务:docker‐compose stop/restart
多服务案例
version: '3' services: net_demo: image: net_img ports: - 8888:8888 container_name: net.renwoxing.cn restart: on-failure networks: - mynetwork depends_on: - mysql.renwoxing.cn - redis.renwoxing.cn mysql.renwoxing.cn: image: mysql:5.7 ports: - 3306:3306 container_name: mysql.renwoxing.cn restart: on-failure networks: - mynetwork environment: MYSQL_ROOT_PASSWORD: 123456 volumes: - mysql_conf:/etc/mysql/conf.d - mysql_data:/var/lib/mysql - mysql_logs:/logs redis.renwoxing.cn: image: redis:7.0.5 ports: - 6379:6379 container_name: redis.renwoxing.cn networks: - mynetwork restart: on-failure networks: mynetwork: volumes: mysql_conf: mysql_data: mysql_logs:
-
version:version通常在一个docker-compose.yml文件的最顶部,用来表示文件内 容的约束版本(类似于XML文件约束)(版本越高,支持的指令越多)
-
services用来声明服务,在services下的所有同缩进的应用名称都代表一个服务,如 上面示例中的web和db。在进行多服务部署的时候,有多少个服务需要同时部署, 就需要在services参数下面声明并配置多少个服务
-
image:容器启动需要依赖的镜像(如果本地没有会自动pull)
-
restart:服务重启策略
-
restart: "no" #服务默认值为no,即服务失败后没有任何动作
-
restart: always #表示服务会一直重新启动
-
restart: on-failure #表示服务提示失败错误后会重新启动
-
restart: unless-stopped #表示只有服务在停止后才会重启
-
-
container_name:指定容器名称
-
ports:指定服务向外暴露的端口
-
networks:指定容器使用的网络
-
depends_on:服务依赖决定了服务的依赖关系,如示例中的web依赖db,所以 db服务会先于web服务启动,但并不表示db服务完全启动成功后才启动web服 务,它只决定启动的先后顺序而已
-
deploy:deploy参数是Docker Compose针对Swarm集群部署提供的,子参数 专门用于指定与服务部署和运行相关的配置
-
replicas:表示服务实例的副本数量
-
restart_policy:estart_policy参数同前面介绍的restart类似,都是用来配置 服务重启策略的,只是该属性配置在deploy参数下,并只在集群环境下生 效。该参数包含多个子属性及属性值
-
condition: on-failure #表示服务重启的条件,值有none、on-failure和 any
-
delay: 5s #表示重启服务之间等待时间,默认为0
-
max_attempts: 3 #表示失败后尝试重启的次数
-
window: 120s #表示等待多久来确定服务是否启动成功
-
-
placement:placement用来配置指定位置的约束,当服务在Swarm集群环 境下部署时会随机分配到管理节点和其他工作节点上。在上述示例中由于将 mysql数据挂载到了本机example-mysql数据卷中,所以使用了placement 的子参数constraints: [node.role == manager]指定该服务只在manager管理节点上运行 :
-
-
environment: 用于配置服务启动时需要的环境变量。如上述示例中 MYSQL_ROOT_PASSWORD表示数据库root用户的密码,MYSQL_DATABASE表 示数据库启动后自动创建的数据库。
-
-
networks:用于配置服务网络
-
volumes:目录挂载,上述示例中是将mysql数据挂载到本地example-mysql数据卷 中,如果该数据卷不存在,服务启动时也会默认创建
其他配置可参考:https://docs.docker.com/compose/compose-file/