九、安装Docker Compose 编排工具

打印 上一主题 下一主题

主题 564|帖子 564|积分 1692

根据前面所学的知识可知,想要使用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
    1. k: v
    复制代码
     
  • 对象:键值对的集合。map(Dictionary)、hash(HashTable)、set(HashSet)、object
    1. 行内写法:  k: {k1:v1,k2:v2,k3:v3}
    2. #或
    3. k:
    4.   k1: v1
    5.   k2: v2
    6.   k3: v3
    复制代码
     
  • 数组:一组按次序排列的值。array、list、queue
    1. 行内写法:  k: [v1,v2,v3]
    2. #或者
    3. k:
    4. - v1
    5. - v2
    6. - v3
    复制代码
     
Java 示例
  1. @Data
  2. public class Person {
  3.     private String userName;
  4.     private Boolean boss;
  5.     private Date birth;
  6.     private Integer age;
  7.     private Pet pet;
  8.     private String[] interests;
  9.     private List<String> animal;
  10.     private Map<String, Object> score;
  11.     private Set<Double> salarys;
  12.     private Map<String, List<Pet>> allPets;
  13. }
  14. @Data
  15. public class Pet {
  16.     private String name;
  17.     private Double weight;
  18. }
复制代码
 
.Net 示例
  1. public class Person {
  2.     public String UserName { get; set; }
  3.     public bool Boss { get; set; }
  4.     public DateTime Birth { get; set; }
  5.     public int Age { get; set; }
  6.     public Pet PersonPet { get; set; }
  7.     public String[] Interests { get; set; }
  8.     public List<String> Animal { get; set; }
  9.     public Dictionary<String, Object> Score { get; set; }
  10.     public HashSet<Double> Salarys { get; set; }
  11.     public Dictionary<String, List<Pet>> AllPets { get; set; }
  12. }
  13. public class Pet {
  14.     public String Name { get; set; }
  15.     public Double Weight { get; set; }
  16. }
复制代码
 
yaml表示以上对象
  1. person:
  2.   userName: zhangsan
  3.   boss: false
  4.   birth: 2019/12/12 20:12:33
  5.   age: 18
  6.   pet:
  7.     name: tomcat
  8.     weight: 23.4
  9.   interests: [篮球,游泳]
  10.   animal:
  11.     - jerry
  12.     - mario
  13.   score:
  14.     english:
  15.       first: 30
  16.       second: 40
  17.       third: 50
  18.     math: [131,140,148]
  19.     chinese: {first: 128,second: 136}
  20.   salarys: [3999,4999.98,5999.99]
  21.   allPets:
  22.     sick:
  23.       - {name: tom}
  24.       - {name: jerry,weight: 47}
  25.     health: [{name: mario,weight: 47}]
复制代码
 
2. 安装与卸载

前提条件:docker 版本不能低于docker 18

  • 从github上下载docker-compose二进制文件安装
    1. 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下载
    1. 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
    复制代码
     
    1. 添加可执行权限
    复制代码
    1. sudo chmod +x /usr/local/bin/docker-compose
    复制代码
     
  • 测试安装结果
    1. $ docker-compose --version
    复制代码
     
     
卸载
  1. 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 镜像
  1. $ docker pull redis:5.7
复制代码
 
2、需要新建一个空白目录,例如rwtest。新建一个docker‐compose.yml,编辑该文件:
  1. version: '3'
  2. services:
  3.   redis:
  4.     image: redis:7.0.5
  5.     ports:
  6.       - 6379:6379
  7.     container_name: redis
  8.     networks:
  9.       - mynetwork
  10. networks:
  11.   mynetwork:
复制代码
 
该文件中内容:新建db和wordpress容器。等同于:
  1. $ docker run -d --name redis --net mynetwork -p 6379:6379 redis:7.0.5
复制代码
 
3、启动docker compose
  1. $ docker‐compose up -d
复制代码
 
5、停止/重启服务:docker‐compose stop/restart
多服务案例
  1. version: '3'
  2. services:
  3.   net_demo:
  4.     image: net_img
  5.     ports:
  6.       - 8888:8888
  7.     container_name: net.renwoxing.cn
  8.     restart: on-failure
  9.     networks:
  10.       - mynetwork
  11.     depends_on:
  12.       - mysql.renwoxing.cn
  13.       - redis.renwoxing.cn
  14.   mysql.renwoxing.cn:
  15.     image: mysql:5.7
  16.     ports:
  17.       - 3306:3306
  18.     container_name: mysql.renwoxing.cn
  19.     restart: on-failure
  20.     networks:
  21.       - mynetwork
  22.     environment:
  23.       MYSQL_ROOT_PASSWORD: 123456
  24.     volumes:
  25.       - mysql_conf:/etc/mysql/conf.d
  26.       - mysql_data:/var/lib/mysql
  27.       - mysql_logs:/logs
  28.   redis.renwoxing.cn:
  29.     image: redis:7.0.5
  30.     ports:
  31.       - 6379:6379
  32.     container_name: redis.renwoxing.cn
  33.     networks:
  34.       - mynetwork
  35.     restart: on-failure
  36. networks:
  37.   mynetwork:
  38. volumes:
  39.   mysql_conf:
  40.   mysql_data:
  41.   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 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表