Docker 构建集群/服务/Compose/分布式服务栈

既然docker是操作系统级别的轻量化标准容器,那么标准化让docker接下来有了很多特性,像弹性扩展。利用这一特性,把将应用通过docker构建集群。docker内置了提供集群构建的功能的,开启集群服务后,可以结合docker容器网络,利用overlay可以构建跨多台主机的虚拟网络,然后再此基础上还能构建负载均衡服务。

集群

集群cluster or swarm,集群是一组机器通过某种可通行关系(如底层以太网,或更上层应用层,或者我们这里提到的docker服务集群)

初始化集群服务

docker swarm init

启动集群服务

安装docker-machine

参考:https://docs.docker.com/machine/install-machine/#installing-machine-directly

管理节点和工作节点

两种节点的区别:只有swarm manage节点可以执行力docker命令,工作节点只能提供服务。

  1. Swarm managers : 执行docker swarm init
  2. Workers nodes:执行docker swarm join 。。。manager的token

查看集群所有节点及开启状态

docker node ls

docker info |grep -i swarm # 查看集群服务开启状态

docker集群构建完成

添加节点,构建网docker集群后,我们在单机上的docker操作就要提升为集群的操作响应了。也就是说,当前我们所在节点机上,如果我们使用docker-cli进行操作,其实是当前节点机所在集群的操作,docker-cli所面临的对象从单即docker,变为了docker swarm manager对象,这个对象就是集群的代表对象。

集群中部署应用

  1. 管理节点中部署

  2. 工作节点中部署

集群服务访问特性

前提知识:如果是水平扩展服务集群,通常要求是提供单入口访问服务,那么集群中怎么提供单入口提供服务呢?那就要看入口是什么?入口:对于web服务,ip+port就是入口,然而集群时多机器,每个机器由ip+port。所以需要负载均衡器(load balancer), 通过load balancer对外提供单一入口ip+port, 然后对集群中提供水平服务的节点分发请求。回到docker集群,如果提供web服务由多个相同应用容器提供,docker将每个服务进行抽象,抽象成:定义一个服务(入口),那么提供服务有对应的APP镜像,可以调整运行几个容器来服务,那么每个服务就要有一个负载均衡策略配置到docker的swarm load balancer对象中。这就是docker swarm 提供负载均衡服务的原理。

基于这一原理,有了以下特性:

  1. 集群中每个节点都开启了集群服务。
  2. 集群中每个节点都有一个负载均衡器对象。
  3. 集群网络是利用docker容器的overlay网络模型。
  4. 集群节点都启动了相同的对外服务,利用负载均衡器对象。
  5. 集群节点无论是否有实际的APP应用容器运行,都可以通过负载均衡器对象转发到集群中算法命中的节点。

集群交换端口

只要开启了集群mode,都会有以下端口开启,用于集群节点间通信实际

  1. Port 7946 TCP/UDP for container network discovery.
  2. Port 4789 UDP for the container ingress network.

服务(负载均衡)

可以通过docker stack 再你哟管compose-file 中定义的服务,来创建基于容器的服务,服务由多个容器提供,使用docker 内置负载均衡来分发服务请求到多个容器中。

如:

定义服务通过docker-compose.yml

启动服务

docker stack deploy -c docker-compose.yml getstartedlab

停止服务

docker stack rm getstartedlab

docker-compose

下载参考:https://github.com/docker/compose/releases/tag/1.24.1

集群分布式服务栈

也就是在利用docker swarm集群分布式部署应用到集群节点,而应用可能基于依赖其它应用,或者被其它应用所需要,所以就堆成了栈结构,一层一层。就叫做集群分布式服务栈。

还要明确集群服务层次间的关系是:有些服务是提供给多个服务,如数据库服务集群,可能提供给多个web应用服务。而上层服务与下层服务间,通过节点中任意一节点即可,也就是集群中服务栈中的多个服务复用同一个docker load balancer负载均衡器。

构建集群分布式服务栈

docker stack deploy

  1. 利用这个命令可以从docker-compose.yml文件中读取与部署服务

docker stack, docker swarm 与 docker compose 关系

  1. swarm 与 compse都是对多个容器进行编排管理,swarm是针对集群实在集群服务层面,而compse是不是集群,是对单docker服务机器进行编排多个应用容器。 docker stack 是在swarm开启基础上,进行部署多层服务栈的。
  2. docker-compose.yml在着三者间的作用,首先用到docer-compose.yml的只有docker compose和docker stack , docker swarm只是提供集群基础服务,对于部署应用到swarm是通过docker stack. 也就是得出结论:docker-compose.yml 如果里面定义了服务,单机和集群都能用,只是两者只会使用自己有用的信息,单机取单机信息,集群都集群信息。

集群分布式服务栈之间的网络通信配置

  1. 因为每一个服务在集群中,容器时处于集群容器网络中的,docker利用服务名作为网络的主机域名作用,所以通过可以使用服务名作为ip地址的域名来配置访问。

docker-compose.yml文件


version: "3"services:
web: # 服务
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer: # 服务
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes: # 数据卷
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement: # 部署位置定义
constraints: [node.role == manager] # 只部署在manager
networks:
- webnetnetworks:
webnet:

PS

  1. 利用docker stack如果报错“Error response from daemon: rpc error: code = 4 desc = context deadline exceeded”,检查几次yml文件,在阿里云上的话可能是网络问题,一般第一次不会成功,执行力第二次就成功了。
  2. docker stack 由于是集群部署,所有几点必须能访问通一个docker hub(无论公私),所以yml中的镜像必须是hub上的,因为每个节点本地不一定有相同镜像。
  3. 对于docker EE版本,提供了http routing mesh,即docker集群中,定义的服务名可以当作域名进行使用。在docker集群容器网络中,这个服务名是可以被解析到相应的节点上,并提供访问的。

小结

  1. container+image+service+swarm+stack+scaling+load-balancing+volumes+ placement-constraints
  2. 首先构建我们自己的app镜像,可以进行分布式部署,即应用可以水平无限扩展,基础件如redis,mysql在集群中单服务(或者主主热备),app镜像中配置好服务。push我们的app镜像到集群的docker-hub总,然后定义docker-compse.yml,在其中定义服务栈,规划volume,和对外端口。然后启动swarm服务,最后部署docker stack deploy 我们的服务。

Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈的更多相关文章

  1. Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则

    文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...

  2. 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群

    庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介      前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...

  3. 轻松搭建docker应用的mesos集群

    7条命令在docker中部署Mesos集群 所有使用的Docker容器构建文件是有也.您可以在本地构建每个容器或只使用位于Docker Hub预构建的容器.下面的命令会自动下载所需的预建的容器为您服务 ...

  4. Docker 搭建 Redis Cluster 集群环境

    使用 Docker 搭建 Redis Cluster,最重要的环节就是容器通信的问题,这一块我们在之前的文章中已经给大家解决了<Docker 网络模式详解及容器间网络通信>,本篇文章主要练 ...

  5. Docker 部署 RocketMQ Dledger 集群模式( 版本v4.7.0)

    文章转载自:http://www.mydlq.club/article/97/ 系统环境: 系统版本:CentOS 7.8 RocketMQ 版本:4.7.0 Docker 版本:19.03.13 一 ...

  6. Docker 容器部署 Consul 集群

    Docker 容器部署 Consul 集群 一.docker安装与启动1.1安装docker[root@localhost /]# yum -y install docker-io 1.2更改配置文件 ...

  7. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  8. 宝塔面板 + Rancher + 阿里云镜像仓库 + Docker + Kubernetes,添加集群、部署 web 应用

    目录 一,安装宝塔面板(V 6.8) 二,使用宝塔安装 Docker,配置阿里云容器服务 三,安装 Rancher (Server) 四,管理 Rancher.添加集群 五,添加 Rancher 应用 ...

  9. Docker实战之Consul集群

    前言 最近参加了几场 Java 面试,发现大多数的微服务实践还是 Eureka 偏多,鉴于笔者的单位选型 Consul,这里对 Consul 做简单总结. 该篇是 Docker 实战系列的第三篇.传送 ...

随机推荐

  1. python合并字典

    给定一个字典,然后计算它们所有数字值的和. 实例 1 : 使用 update() 方法,第二个参数合并第一个参数 def Merge(dict1, dict2): return(dict2.updat ...

  2. map和object互转的几种方式

    1.使用Apache中的BeanUtils类,导入commons-beanutils包. 2.使用JSON 3.利用java.lang.reflect.Field类完成Obj和Map之间的相互转换 h ...

  3. PATB1024科学计数法

    代码是部分正确,只得了13分还有两个测试点没有通过,不知道原因是啥,先不深究了,赶进度. 参考代码: #include<cstdio> #include<cstring> #i ...

  4. SQL之存储过程详细介绍及语法(转)

    1:定义 存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行. 存储过程分为系统存储过程和自定义 ...

  5. cad.net 定义lisp

    首先是传参型lisp的定义: (addLine (getpoint)) //定义lisp传入参数的例子 //复制到命令栏运行: (addLine (getpoint)) [LispFunction(& ...

  6. eclipse中正确创建Django项目

    本教程只说明eclipse中django项目的创建,不涉及django相关开发内容: 1."File" -> "New" -> "Othe ...

  7. play framework + sbt入门之环境搭建

    一 sbt的使用 SBT = (not so) Simple Build Tool,是scala的构建工具,与java的maven地位相同.其设计宗旨是让简单的项目可以简单的配置,而复杂的项目可以复杂 ...

  8. ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断

    软件的定时中断很难控制精准触发沿的位置,可以通过 PL-PS 的中断完成精准的定时中断.PL 的中断通过 Verilog 代码产生,这样紧密结合 PS-PL 的处理,发挥各自的优势. 一.PL 侧定时 ...

  9. .Net Core3.0使用gRPC 和IdentityServer4

    gRPC是什么gRPC是可以在任何环境中运行的现代开源高性能RPC框架.它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证.它也适用于分布式计 ...

  10. 『正睿OI 2019SC Day5』

    网络流 网络流的定义 一个流网络\(G=(V,E)\)为一张满足以下条件的有向图: 每一条边有一个非负容量,即对于任意\(E\)中的\((u,v)\) , 有\(c(u,v)\geq0\). 如果\( ...