Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈
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 部署 RocketMQ Dledger 集群模式( 版本v4.7.0)
		文章转载自:http://www.mydlq.club/article/97/ 系统环境: 系统版本:CentOS 7.8 RocketMQ 版本:4.7.0 Docker 版本:19.03.13 一 ... 
- 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 实战系列的第三篇.传送 ... 
随机推荐
- IO多路复用——poll
			1.基本知识 poll是Linux中的字符设备驱动中的一个函数.Linux 2.5.44版本后,poll被epoll取代.和select实现的功能差不多,poll的作用是把当前的文件指针挂到等待队列. ... 
- 【字符串】KMP
			Algorithm Task 给定一个文本串 \(S\) 和一个模式串 \(T\),求 \(T\) 在 \(S\) 中出现的所有位置. Limitations 要求时空复杂度均为线性. Solutio ... 
- web服务本质
			目录 django 框架引入: web框架本质 HTTP协议 多功能web服务 封装,分发处理 django 框架引入: web框架本质 web框架本质: 软件开发架构: c / s ; b/ s - ... 
- #lua中编写shader的方式
			lua中编写shader的方式 1. 字符串拼接 类似于下面这种 vertDefaultSource = "\n".."\n" .. "attribu ... 
- Ubuntu 在终端关闭情况下仍然运行进程
			参考: 让Linux关闭终端(关闭SSH等)后,程序继续运行 Ubuntu 在终端关闭情况下仍然运行进程 在 Ubuntu 16.04 系统下使用 screen 命令在终端关闭情况下仍然运行进程.具体 ... 
- idea pycharm 常用快捷键
			Ctrl + P 方法参数提示显示 (必备)Alt + Enter 根据光标所在问题,提供快速修复选择,光标放在的位置不同提示的结果也不同 (必备)Ctrl + / 行注释(可选中多行)Ctrl + ... 
- [转帖]统一操作系统 UOS 龙芯版上线
			统一操作系统 UOS 龙芯版上线 看评论很有必要 搞一波 深度的操作系统了https://www.oschina.net/news/112065/chinauos-with-loongson?p=4 ... 
- Prometheus 重新标签
			Prometheus 重新标签 允许在采集之前对任何目标及其标签进行修改 • 重命名标签名 • 删除标签 • 过滤目标 action:重新标签动作 replace:默认,通过regex匹配source ... 
- Java Objective-C AOP
			Java Use an AOP library or byte-code engineering (BCEL, cglib, asm, etc) to create a sub-class on th ... 
- React实例------红绿灯
			概述 一个react的demo的实例,适合初学react的新手练习. 效果 用webpack打包后的目录结构 index.html react的封装,复用与Java的类似,面向对象的编程思想.所以in ... 
