物联网架构成长之路(24)-Docker练习之Compose容器编排

时间:2022-08-22 14:29:15

0.前言
  一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂。因此学习东西还是要循序渐进,慢慢来。先了解单机编排技术Docker Compose,了解一些技术细节及原理后,在入手K8s。还是不能一口吃成胖子,要多吃几口才可以。而且目前公司都是一些小项目,能用得上DockerCompose已经很不错了,还想要上K8s,估计是不现实的。

1. 安装

  可以通过运行下面命令进行安装,

 curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` -o docker-compose
chmod +x docker-compose
mv docker-compose /usr/local/bin

  安装Tab自动补全

curl -L https://raw.githubusercontent.com/docker/compose/1.23.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

  由于我看得是《Spring Cloud与Docker微服务架构实战 第二版》这本书,里面刚好有个例子,这里就用这个做练手。

 git clone https://github.com/itmuch/spring-cloud-docker-microservice-book-code-docker/
cd spring-cloud-docker-microservice-book-code-docker
cd docker--simple
mvn clean package docker:build

  里面的每个微服务都构建成一个Docker Image,然后就可以开干了。

物联网架构成长之路(24)-Docker练习之Compose容器编排

2. 简单例子

  从一个简单的例子开始
  Dockerfile 文件

 FROM java:latest
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]

  docker-compose.yml 文件

 version: ''
services:
eureka:
build: .
ports:
- "8761:8761"

  执行 docker-compose up

物联网架构成长之路(24)-Docker练习之Compose容器编排

  从下图可以看出,docker-compose 执行后,分别创建了 compose_eureka Image, compose_default Network, compose_eureka_1_b5 Container

物联网架构成长之路(24)-Docker练习之Compose容器编排

  以上就是入门了,关于docker-compose更多的语法,这里就不展开了,具体肯定是参考其他博客,或者官方文档吧

3. 实战练习

  参考书本上的例子进行练习

  3.1 基于Spring Boot微服务的Compose编写

  这里要使用上述 github 代码里 docker-1-simple 这个目录下的代码进行编译

 version: '3'
services:
discovery:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/microservice-discovery-eureka:0.0.1-SNAPSHOT
ports:
- "8761:8761"
microservice-provider-user:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/microservice-provider-user:0.0.1-SNAPSHOT
microservice-consumer-movie-ribbon-hystrix:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT
microservice-gateway-zuul:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/microservice-gateway-zuul:0.0.1-SNAPSHOT
microservice-hystrix-dashboard:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/microservice-hystrix-dashboard:0.0.1-SNAPSHOT
ports:
- "8030:8030"
microservice-hystrix-turbine:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/microservice-hystrix-turbine:0.0.1-SNAPSHOT

  运行后,就启动对应的6个Image,以下是运行后效果

物联网架构成长之路(24)-Docker练习之Compose容器编排

  使用之前的weave scope工具查看docker, 可以看到5个微服务通过Spring Boot的Eureka连接在一起了。还有一个microservice-hystrix-dashboard这个没有在里面是因为这个是一个仪表盘(Dashboard),不属于实际业务,所以代码里面没有关联起来,实际上是已启动的。
  从图中还可以看到,后面的那两个集群etcd和elasticsearch,这两个是之前做练习时创建的。初学者,利用这个weave scope工具来查看和监控,挺好用的。

物联网架构成长之路(24)-Docker练习之Compose容器编排

  3.2 基于Eureka高可用(HA)的Compose编写

  这里要使用上述 github 代码里 docker-2-eureka-ha 这个目录下的代码进行编译

 version: "3"
services:
peer1: # 默认情况下,其他服务可使用服务名称连接到该服务。对于peer2节点,它需连接http://peer1:8761/eureka/,因此,我们可配置该服务的名称为peer1。
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
ports:
- "8761:8761"
environment:
- spring.profiles.active=peer1
peer2:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
hostname: peer2
ports:
- "8762:8762"
environment:
- spring.profiles.active=peer2 ## 使用Compose编排高可用的Eureka Server

  通过Eureka自带的Dashboard可以看到启动的两个容器已经互相注册,实现高可用(HA)功能

物联网架构成长之路(24)-Docker练习之Compose容器编排

  3.3 基于Spring Boot微服务集群及动态伸缩的Compose编写

  这里要使用上述 github 代码里 docker-3-complex 这个目录下的代码进行编译,要在每个项目的根目录下,执行 mvn clean package docker:build

 version: "3"
services:
peer1:
image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
ports:
- "8761:8761"
environment:
- spring.profiles.active=peer1
peer2:
image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
hostname: peer2
ports:
- "8762:8762"
environment:
- spring.profiles.active=peer2
microservice-provider-user:
image: itmuch/microservice-provider-user:0.0.1-SNAPSHOT
microservice-consumer-movie-ribbon-hystrix:
image: itmuch/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT
microservice-gateway-zuul:
image: itmuch/microservice-gateway-zuul:0.0.1-SNAPSHOT
microservice-hystrix-turbine:
image: itmuch/microservice-hystrix-turbine:0.0.1-SNAPSHOT

  通过Eureka的Dashboard查看

物联网架构成长之路(24)-Docker练习之Compose容器编排

  仔细查看下图,可以观察到各个Container间箭头的指向,用于理解Spring Boot各个微服务间关系

物联网架构成长之路(24)-Docker练习之Compose容器编排

  执行以下命令,为各个微服务动态扩容。让各个微服务都执行3个实例,由于docker-compose版本问题,建议使用 --scale 参数来设置启动实例。

 docker-compose up --scale microservice-provider-user=3 \
--scale microservice-consumer-movie-ribbon-hystrix=3 \
--scale microservice-gateway-zuul=3 \
--scale microservice-hystrix-turbine=3

物联网架构成长之路(24)-Docker练习之Compose容器编排

  Eureka的Dashboard查看

物联网架构成长之路(24)-Docker练习之Compose容器编排

物联网架构成长之路(24)-Docker练习之Compose容器编排

  3.4 修改之前博客中的etcd集群配置,改为docker-compose方式启动(自己实践)

 version: "3"
services:
etcd01:
image: etcd:3.3
ports:
- "10001:2379"
- "10011:2380"
#volumes:
#- "/root/workspace/docker/k8s/etcd/data11:/data"
command:
- /bin/etcd
- --data-dir
- /data
- -name
- etcd01
- -advertise-client-urls
- http://etcd01:2379
- -listen-client-urls
- http://0.0.0.0:2379
- -initial-advertise-peer-urls
- http://etcd01:2380
- -listen-peer-urls
- http://0.0.0.0:2380
- -initial-cluster-state
- new
- -initial-cluster-token
- docker-etcd
- -initial-cluster
- etcd01=http://etcd01:2380,etcd02=http://etcd02:2380,etcd03=http://etcd03:2380
etcd02:
image: etcd:3.3
ports:
- "10002:2379"
- "10012:2380"
#volumes:
#- "/root/workspace/docker/k8s/etcd/data22:/data"
command:
- /bin/etcd
- --data-dir
- /data
- -name
- etcd02
- -advertise-client-urls
- http://etcd02:2379
- -listen-client-urls
- http://0.0.0.0:2379
- -initial-advertise-peer-urls
- http://etcd02:2380
- -listen-peer-urls
- http://0.0.0.0:2380
- -initial-cluster-state
- new
- -initial-cluster-token
- docker-etcd
- -initial-cluster
- etcd01=http://etcd01:2380,etcd02=http://etcd02:2380,etcd03=http://etcd03:2380
etcd03:
image: etcd:3.3
ports:
- "10003:2379"
- "10013:2380"
#volumes:
#- "/root/workspace/docker/k8s/etcd/data33:/data"
command:
- /bin/etcd
- --data-dir
- /data
- -name
- etcd03
- -advertise-client-urls
- http://etcd03:2379
- -listen-client-urls
- http://0.0.0.0:2379
- -initial-advertise-peer-urls
- http://etcd03:2380
- -listen-peer-urls
- http://0.0.0.0:2380
- -initial-cluster-state
- new
- -initial-cluster-token
- docker-etcd
- -initial-cluster
- etcd01=http://etcd01:2380,etcd02=http://etcd02:2380,etcd03=http://etcd03:2380

  测试,实际效果是,对3个节点的增删改查操作都是等效的

curl http://127.0.0.1:10001/v2/keys/hello -XPUT -d value="hello world"

4. 小结

  这几天的练习与了解,算是对Docker及Docker Compose有了一定的了解,接下来,就以实际项目中需要用到的服务构建成一个个Docker Image并推送到阿里云容器私有仓库上。初期会构建的有STUN服务、Nginx-RTMP服务、EMQ-MQTT服务、Redis与MongoDB服务,暂时会先构建这几个服务。服务间还涉及到认证与鉴权的,还会写代码,业务代码应该还是用Spring Cloud全家桶,以练促学,未来之路,任重而道远呀!加油!

本文地址: https://www.cnblogs.com/wunaozai/p/9936306.html

物联网架构成长之路(24)-Docker练习之Compose容器编排的更多相关文章

  1. 物联网架构成长之路(25)-Docker构建项目用到的镜像1

    0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...

  2. 物联网架构成长之路(27)-Docker练习之Zookeeper安装

    0. 前言 准备了解一下消息队列MQ,对比了一些开源的中间件,最后选择Kafka作为以后用到的消息队列,消息队列的应用场景及Kafka与其他消息队列的优缺点这里就不细说了,具体的可以参考其他博客说明. ...

  3. 物联网架构成长之路(22)-Docker练习之Etcd服务搭建

    0. 前言 时隔多日,前段时间忙完一个可有可无的项目后,又进入摸鱼时间,没有办法,非互联网公司,就是闲得蛋疼.又开始了自学之路.以前入门过Docker,然后又很久没有看了,最近重新看了一下,推荐一下这 ...

  4. 物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)

    0. 前言 消息队列MQ,这个在一般的系统上都是会用到的一个中间件,我选择Kafka作为练手的一个中间件,Kafka依赖Zookeeper.Zookeeper安装上一篇博客已经介绍过了. 1. Kaf ...

  5. 物联网架构成长之路(26)-Docker构建项目用到的镜像2

    0. 前言 前面介绍的都是一些标准的第三方中间件,基本都是有现成的Dockerfile或者Image,不需要我过多的关心,这一篇要介绍一些自己构建的Docker Image了.刚开始学,Dockerf ...

  6. 物联网架构成长之路(23)-Docker练习之Elasticsearch服务搭建

    0. 前言 最近基本都是学一些环境配置,和一些中间件的安装与配置.没有实际编写代码.可能看起来有点水,我对自己的学习方式是,先要了解各个中间件的安装配置以及简单使用,理论应用场景,然后我在小项目中,逐 ...

  7. 物联网架构成长之路(44)-Docker私有仓库Harbor

    0. 前言 安装docker.docker-compose,这些在我以前的博客讲过,这里就不继续说明了,有需要的可以参考我之前的博客. https://www.cnblogs.com/wunaozai ...

  8. 物联网架构成长之路(31)-EMQ基于HTTP权限验证

    看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...

  9. 物联网架构成长之路(35)-利用Netty解析物联网自定义协议

    一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...

随机推荐

  1. 【转】sql to_char 日期转换字符串

    1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11 ...

  2. Runtime.exec() sucks!!!!

    自己项目中使用到了 Runtime rt = Runtime.getRuntime(); Process p = rt.exec("query session");p.waitFo ...

  3. Unity3d 鼠标拣选小功能集合

    最近在做一些优化工具,把鼠标拣选的功能单独抽出来. 可遍历所有选中的某类型资源,会递归文件夹 可编译所有prefab的某个Component,也是递归的 using UnityEngine; usin ...

  4. hdu3535 背包大杂汇

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3535 //不想写题解,这道题让我对背包的理解更深了,我相信我不会忘记的.... 代码: # ...

  5. eclipse如何修改dynamic web module version;——eclipse操作备忘

    1.eclipse如何修改dynamic web module version 一.修改工程属性: 右键eclipse的工程,选择属性,再选择Project Facets里面中选择Dynamic We ...

  6. new[] class deconstructor

    Class class(); Class *class1=new class; class1=&class; delete class1;   // Assert 指针指向的是一个栈中的对象, ...

  7. bzoj2453

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题目大意: (1)       若第一个字母为“M”,则紧接着有三个数字L.R.W.表 ...

  8. HashMap实现原理及源码分析(JDK1.7)

    转载:https://www.cnblogs.com/chengxiao/p/6059914.html 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技 ...

  9. 应用“PUSH推送”的5个真相和5个误区

      真相一:用户厌烦的并不是推送功能本身 针对如何看待推送功能这一问题,对1万名用户进行了问卷调查,结果表明80%的用户表示不会拒绝推送功能.各个年龄段方面没有太大的差别,但女性用户更容易受个人兴趣和 ...

  10. angularjs-$location

    $location服务分析浏览器地址栏中的URL(基于window.location),让我们可以在应用中较为方便地使用URL里面的内容.在地址栏中更改URL,会响应到$location服务中,而在$ ...