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命令,工作节点只能提供服务。
- Swarm managers : 执行docker swarm init
- 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对象,这个对象就是集群的代表对象。
集群中部署应用
管理节点中部署
工作节点中部署
集群服务访问特性
前提知识:如果是水平扩展服务集群,通常要求是提供单入口访问服务,那么集群中怎么提供单入口提供服务呢?那就要看入口是什么?入口:对于web服务,ip+port就是入口,然而集群时多机器,每个机器由ip+port。所以需要负载均衡器(load balancer), 通过load balancer对外提供单一入口ip+port, 然后对集群中提供水平服务的节点分发请求。回到docker集群,如果提供web服务由多个相同应用容器提供,docker将每个服务进行抽象,抽象成:定义一个服务(入口),那么提供服务有对应的APP镜像,可以调整运行几个容器来服务,那么每个服务就要有一个负载均衡策略配置到docker的swarm load balancer对象中。这就是docker swarm 提供负载均衡服务的原理。
基于这一原理,有了以下特性:
- 集群中每个节点都开启了集群服务。
- 集群中每个节点都有一个负载均衡器对象。
- 集群网络是利用docker容器的overlay网络模型。
- 集群节点都启动了相同的对外服务,利用负载均衡器对象。
- 集群节点无论是否有实际的APP应用容器运行,都可以通过负载均衡器对象转发到集群中算法命中的节点。
集群交换端口
只要开启了集群mode,都会有以下端口开启,用于集群节点间通信实际
- Port 7946 TCP/UDP for container network discovery.
- 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
- 利用这个命令可以从docker-compose.yml文件中读取与部署服务
docker stack, docker swarm 与 docker compose 关系
- swarm 与 compse都是对多个容器进行编排管理,swarm是针对集群实在集群服务层面,而compse是不是集群,是对单docker服务机器进行编排多个应用容器。 docker stack 是在swarm开启基础上,进行部署多层服务栈的。
- docker-compose.yml在着三者间的作用,首先用到docer-compose.yml的只有docker compose和docker stack , docker swarm只是提供集群基础服务,对于部署应用到swarm是通过docker stack. 也就是得出结论:docker-compose.yml 如果里面定义了服务,单机和集群都能用,只是两者只会使用自己有用的信息,单机取单机信息,集群都集群信息。
集群分布式服务栈之间的网络通信配置
- 因为每一个服务在集群中,容器时处于集群容器网络中的,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
- 利用docker stack如果报错“Error response from daemon: rpc error: code = 4 desc = context deadline exceeded”,检查几次yml文件,在阿里云上的话可能是网络问题,一般第一次不会成功,执行力第二次就成功了。
- docker stack 由于是集群部署,所有几点必须能访问通一个docker hub(无论公私),所以yml中的镜像必须是hub上的,因为每个节点本地不一定有相同镜像。
- 对于docker EE版本,提供了http routing mesh,即docker集群中,定义的服务名可以当作域名进行使用。在docker集群容器网络中,这个服务名是可以被解析到相应的节点上,并提供访问的。
小结
- container+image+service+swarm+stack+scaling+load-balancing+volumes+ placement-constraints
- 首先构建我们自己的app镜像,可以进行分布式部署,即应用可以水平无限扩展,基础件如redis,mysql在集群中单服务(或者主主热备),app镜像中配置好服务。push我们的app镜像到集群的docker-hub总,然后定义docker-compse.yml,在其中定义服务栈,规划volume,和对外端口。然后启动swarm服务,最后部署docker stack deploy 我们的服务。
Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈的更多相关文章
-
Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则
文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...
-
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介 前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...
-
轻松搭建docker应用的mesos集群
7条命令在docker中部署Mesos集群 所有使用的Docker容器构建文件是有也.您可以在本地构建每个容器或只使用位于Docker Hub预构建的容器.下面的命令会自动下载所需的预建的容器为您服务 ...
-
Docker 搭建 Redis Cluster 集群环境
使用 Docker 搭建 Redis Cluster,最重要的环节就是容器通信的问题,这一块我们在之前的文章中已经给大家解决了<Docker 网络模式详解及容器间网络通信>,本篇文章主要练 ...
-
Docker 容器部署 Consul 集群
Docker 容器部署 Consul 集群 一.docker安装与启动1.1安装docker[root@localhost /]# yum -y install docker-io 1.2更改配置文件 ...
-
使用docker安装部署Spark集群来训练CNN(含Python实例)
使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...
-
宝塔面板 + Rancher + 阿里云镜像仓库 + Docker + Kubernetes,添加集群、部署 web 应用
目录 一,安装宝塔面板(V 6.8) 二,使用宝塔安装 Docker,配置阿里云容器服务 三,安装 Rancher (Server) 四,管理 Rancher.添加集群 五,添加 Rancher 应用 ...
-
Docker实战之Consul集群
前言 最近参加了几场 Java 面试,发现大多数的微服务实践还是 Eureka 偏多,鉴于笔者的单位选型 Consul,这里对 Consul 做简单总结. 该篇是 Docker 实战系列的第三篇.传送 ...
-
Docker实战之Zookeeper集群
1. 概述 这里是 Docker 实战系列第四篇.主要介绍分布式系统中的元老级组件 Zookeeper. ZooKeeper 是一个开源的分布式协调服务,是 Hadoop,HBase 和其他分布式框架 ...
随机推荐
-
SPOJ 227 Ordering the Soldiers 线段树 / 树状数组
题意:设原数组为a[i],pos[i]代表第 i 个位置之前有多少个数比a[i]大,求原数组a[i]. 这个题意是看了别人的题解才明白,我自己没读出来…… 方法:假设我们从左往右放,因为后面的数还有可 ...
-
不相交集合ADT
不相交集合数据结构保持一组不相交的动态集合S={S1,S2,...,SK},每个集合通过一个代表来识别,代表即集合中的某个成员. 如果x表示一个对象,不相交集合支持以下操作: MAKE-SET(x): ...
-
Spring MVC(二)
spring mvc工作流 1A)客户端发出http请求,只要请求形式符合web.xml 文件中配置的*.action的话,就由DispatcherServlet 来处理. 1B)Dispatcher ...
-
Docker,Docker Compose,Docker Swarm,Kubernetes之间的区别
Dcoker Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Docker创建,运行在Docker中,其他相关的容器技术都是以Docker为基础,它是我 ...
-
[转]构建高性能MySQL体系
来源:http://www.yunweipai.com/archives/21232.html 构建高性能MySQL系统涵盖从单机.硬件.OS.文件系统.内存到MySQL 本身的配置,以及schema ...
-
从VMware虚拟机安装到hadoop集群环境配置详细说明(第一期)
http://blog.csdn.net/whaoxysh/article/details/17755555 虚拟机安装 我安装的虚拟机版本是VMware Workstation 8.04,自己电脑上 ...
-
不错位的java .class 反编译工具推荐
我们经常会反编译看一些class文件,但是反编译出来的文件里面会有很多杂乱的东西 一直以来都是用的idea来反编译的,只要把class文件往里面一拖就行了 这么用没问题,用来看看源码什么的都OK 但是 ...
-
20155338 2016-2017-2 《Java程序设计》第8周学习总结
20155338 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 一.日志 API简介 java++.util.logging包提供了日志功能相关类与接口,不 ...
-
【cs231n】反向传播笔记
前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专业的翻译,在此我会直接copy他们翻译的笔记,有些地方会用红字写自己的笔记,本文只是作为自己的学习笔记.本文内容官网链接: ...
-
DES加密原理
DES加密步奏: 1.初始化两个字符串,一个为指定的秘钥,一个为初始化向量,要求是8个字符. 2.加密:秘钥.向量.需加密的字符串传换成byte[]类型: 声明加密标准类,DESCryptoServi ...