zoukankan      html  css  js  c++  java
  • 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命令,工作节点只能提供服务。

    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 我们的服务。
  • 相关阅读:
    mysql引擎简介
    spring mvc + mybatis 框架搭建 ( idea + gradle)
    ubuntu下 java、mysql、tomcat(ssl认证) 配置
    Zookeeper 选举机制和脑裂问题
    mininet 入门引导
    Mac OS X 使用python urllib 模块 通过ssl访问报错 urllib.error.URLError
    macOS 下,连接zookeeper等java软件加载较慢的解决方案
    探索学习LinkedList和ArrayList的差别
    mininet 部署记录
    分布式系统 学习笔记
  • 原文地址:https://www.cnblogs.com/ZJiQi/p/11158342.html
Copyright © 2011-2022 走看看