九、安装Docker Compose 编排工具

发布时间 2023-11-29 18:19:33作者: 誉尚学教育

根据前面所学的知识可知,想要使用Docker部署应用,就要先在应用中编写Dockerfile 文件来构建镜像。同样,在微服务项目中,我们也需要为每一个服务编写Dockerfile文件 来构建镜像。构建完成后,就可以根据每一个镜像使用docker run或者docker service create命令创建并启动容器,这样我们就可以访问容器中的服务了。

微服务架构中:涉及的服务数量巨多。

虽然使用上述方式可以部署微服务项目,但考虑到微服务项目可能有多个子服务组成, 并且每个服务启动过程中都需要配置额外的参数(如-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

  1. 从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

     

    添加可执行权限
  2. sudo chmod +x /usr/local/bin/docker-compose

     

  3. 测试安装结果

    $ 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/

 
配套视频链接:全网首发java/.net双案例Docker精品课程,Docker 进阶教程(双语言双案例助力教学)-已完结_哔哩哔哩_bilibili