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 我们的服务。
原文地址:https://www.cnblogs.com/ZJiQi/p/11158342.html