马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
根据前面所学的知识可知,想要使用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
- 对象:键值对的集合。map(Dictionary)、hash(HashTable)、set(HashSet)、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 镜像
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
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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |