Docker:Swarm + Stack 一站式部署容器集群_运维_Lunex的博客-CSDN博客

标签: | 发表时间:2020-02-19 19:44 | 作者:
出处:https://blog.csdn.net

Docker:Swarm + Stack 一站式部署容器集群


概述

Docker将应用沙盒化,将程序的运行与主机的环境隔离开,本身是十分适合进行应用程序的堆砌、组合、互动的。

新推出的(还算新吧)swarm功能将不同的docker容器集成为管理节点-工作节点的集群模式,建立联系的同时也可以分配计算资源,实现以docker容器为单元的并行任务。

既然是集群式的协作,那一个个部署节点就显得太过笨拙了。

所幸,docker的stack功能能够以swarm网络为基础,将不同主机的docker容器以service的形式一步到位。

结合先前做过的fiware组件的docker部署,本文将说明如何跨主机搭建swarm集群,利用搭建的swarm集群创建stack服务,实现fiware组件的跨主机一站式部署。

fiware只是作为一个测试的对象,并不是本文的重点。本文的重点在于如何将一般的docker命令行式的部署转化为yml文件形式的部署,以及一些命令行中的参数如何在yml文件中进行配置。(看不出踩了坑的踩坑记录)


要求

  • 2台linux系统的主机,均已安装Docker engine
  • 了解基本的docker操作。

Docker的 中文资料可以看这篇但是强烈推荐去 docker
官网
看英文版的教程,因为以我看过来的情况,中文教程普遍是官方文档的翻译,而且常有翻译不当,内容缺失,更新不及时等问题。(不是在黑上面贴的那个中文教程,那个还是可以的)


Docker Swarm集群

集群搭建

已经准备的两台主机ip分别为192.168.12.205 : IoTBroker以及192.168.12.206 : iotdiscovery

创建docker swarm集群

      sudodocker swarm init --advertise-addr192.168.12.206

Swarm initialized: current node (8pg89ccu91qon6j1pf0mjq6jr) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join –token [token:保护集群,此处人工马赛克] 192.168.12.206:2377
To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

查看一下swarm状态:
sudo docker info
可以找到

swarm:active

说明swarm已被激活
查看节点情况:
sudo docker node ls

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8pg89ccu91qon6j1pf0mjq6jr * iotdiscovery Ready Active Leader

可以看到swarm集群的节点情况,这个集群现在只有一个节点,即206本机,角色为leader,即管理节点。

将worker节点加入集群:
sudo docker swarm join --token [打码的token] 192.168.12.206:2377
查看节点情况:
sudo docker node ls

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
7v617fvzcla9yjb52iwre86mc IoTBroker Ready Active
8pg89ccu91qon6j1pf0mjq6jr * iotdiscovery Ready Active Leader

可以看到swarm网络中已经有两个节点,分别是在206上的管理节点和205上的工作节点。
节点的manager和worker的角色是可以转变的, 比如想把205转化为管理节点,206变为工作节点,只需进入到205的终端,执行:
sudo docker node promote
就可以完成角色的转变

集群节点操作

查看docker node 配置:
sudo docker node inspect [nodeName]

其中的某些配置可以修改,以便在用compose文件构建时能够根据这些配置属性,精确地定制容器的位置、资源等。

修改docker node配置:
sudo docker node update [option] [nodeName]

      [option]:label-add[key=value]# 以键值对的方式添加labellabel-rm [key]# 移除指定键的label[nodeName]# Docker swarm 集群创建时该节点所取的节点名

Docker Stack

本文中应用的是docker stack的deploy功能:通过搭建完成的swarm框架,以yml文件为配置表单,对docker容器实现跨主机的一站式部署。

概念定义

以下概念都是我自己的理解, 并非官方定义,仅适用于本文,在此之外请忘掉它

  • 项目: 以一个swarm集群为基础,一个yml文件执行一次所生成的docker容器及其互相的连接关系
  • 服务(service): 以统一的配置的一个或多个运行在同一或不同主机上的docker容器
  • 节点(node): swarm集群网络中的一台主机
  • 镜像(image): 由Dockerfile构建的用来生成容器(container)的源
  • 容器(container): 实现某一功能的程序和其相应配套环境的独立集合,由镜像(image)生成

Compose 文件

Compose 文件是一个包含了该项目内所有涉及的服务及其配置的文件

具体配置示例: fiware.yml

      version: "3" # 版本号,deploy功能是3版本特有的,所以只能写3
services: #服务,每个服务对应配置相同的一个或者多个docker容器
  stack_mosquitto: # 服务名,自取
    image: toke/mosquitto #创建该服务所基于的镜像
    ports: # 容器内外的端口映射情况
      -"1883:1883"-"9001:9001"networks: # 替代了命令行模式的--link选项
      fiware:
        aliases:
          -mosquittovolumes: # 容器内外数据传输的对应地址
      -"/srv/mqtt/config:/mqtt/config:ro"-"/srv/mqtt/log:/mqtt/log"-"/srv/mqtt/data/:/mqtt/data/"deploy: 
      replicas: 1 # replicas模式, 复制数目为1
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == worker] # 部署位置,只在工作节点部署

  stack_mongo:
    image: mongo
    ports:
      -"27017:27017"networks:
      fiware:
        aliases:
          -mongovolumes:
      -"/home/ubuntu/db:/data/db"deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == manager]
  stack_orion:
    image: fiware/orion
    ports:
      -"1026:1026"networks:
      fiware:
        aliases:
          -orioncommand: -dbhost stack_mongo # 命令行模式中跟在最后的参数,此条没有固定的格式,建议参照所部署的docker镜像的说明文档来确定是否需要该项、需要写什么
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == manager] 

  stack_iotagent:
    image: telefonicaiot/iotagent-ul
    ports:
      -"4041:4041"-"7896:7896"networks:
      fiware:
        aliases:
          -iotagentdeploy:
      replicas: 1
      placement:
        constraints: [node.role == worker]

networks: #定义部署该项目所需要的网络
  fiware:

上面这个文件包含的信息非常多,可以说本文的一大半关键内容都在里面,如果自己从头去查阅茫茫的资料,说实话,资料不好找。

重点需要说明的是三个参数项, networks、volumes和command

  • networks:

在用命令行部署容器的时候,经常会需要在一个容器里面访问另外一个容器,这个时候就需要用到 --link参数,一般的使用形式为 --link [引用的其他容器名]:[容器内代表引用容器的字段]。被 --link A:B形式引用的A容器会以 [A 的 ip:port] : 'B'的形式出现在容器内的 /etc/hosts文件里。也就是说,经过 --link引入的其他容器A将自己的地址和端口赋给了字段B。在容器内需要获得A的时候,可以直接使用字段B。

但是,在v3版本的compose file中,links属性是会自动被 docker stack deploy命令忽略的,因为在v3中, links的功能以及移除。

作为替代的是 networks属性。

在建立服务前,可以先建立一个和 services参数并级的 networks参数(上文的compose文件末),在 networks参数下,可以设立一个或者多个的网络,形成一个网络的 networks列表。如例子中,设立了一个名为 fiware的网络。

在实际建立服务的时候,在每个服务里面可以添加 networks属性,该属性下可以包括一个或者多个在先前建立的网络列表中的网络名称,表示该服务在这些网络中可以用这些服务的名称来在其他服务中访问。有时因为各种原因,服务的名称和其他容器内访问的字段会不一致,这个时候还可以在网络名称后面再加一级, aliases别名,这些别名可以发挥和服务本身的名字一样的作用,在其所属的 network中被其他服务访问。

  • volumes:

volumes对应命令行中的 -v选项,其本身的意义并没有发生什么变化。但是,由于 volumeyml文件中是以字符串的形式存在的,所以像$PWD这样的写法是不能被接受的,要改成绝对路径。

  • command:

在用命令行运行容器时,有的容器需要在命令中加入附加的命令行参数。比如上文提到的orion,用命令行部署的命令:
sudo docker run -d --name orion --net host -p 1026:1026 fiware/orion -dbhost mongo
在最后有 -dbhost mongo参数,这就需要加在compose文件的服务中的 command中。这一个参数我没有发现什么固定的模式,建议按照对应容器的镜像的使用说明来决定是否需要加,加什么。

用compose 文件启动服务命令格式

sudo docker stack deploy -c [docker-compose.yml] [service name]

Fiware部署

下载相关镜像:

sudo docker pull telefonicaiot/iotagent-ul
sudo docker pull toke/mosquitto
sudo docker pull mongo
sudo docker pull fiware/orion

部署docker stack
sudo docker stack deploy -c fiware.yml fiware
命令行反馈:

Creating network fiware_fiware
Creating service fiware_stack_mosquitto
Creating service fiware_stack_mongo
Creating service fiware_stack_orion
Creating service fiware_stack_iotagent

至此已经部署完毕fiware相关组件。其中orion与mongo在swarm的管理节点,iotagent与mosquitto在swarm的工作节点。四个容器通过swarm分配计算任务,并通过network:fiware网络互相调用。

经测试可以顺利进行设备的注册和数据的传递、更新、储存。和传统(非docker)模式,以及docker非swarm模式部署的fiware组件的功能完全一致。


强大的Docker管理图形界面:Protainer.io

最后推荐一款可以摆脱命令行,实现docker管理的图像交互界面程序。
Protainer.io安装说明
效果展示
安装完成后,用浏览器访问运行着protainer容器ip的9000端口,即可获得以下界面。(推荐用IE,反正Chrome是访问不了的)

此处输入图片的描述
Protainer 的容器使交互界面得以运行。在成功建立了这一界面之后,就可以再添加其他的ip地址主机的Docker情况到这一界面中。无需在每个主机中都运行protainer 的容器,只需要暴露2375端口,对于linuxx:

      cd/etc/defautsudonano docker

修改docker文件

      # DOCKER_OPTS="-H tcp://0.0.0.0:2375"DOCKER_OPTS="$DOCKER_OPTS-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

重启docker 服务

      sudoservice docker restart

就可以在endpoint 版面添加另外的主机了

此处输入图片的描述

protainer中几乎囊括了所有关于docker的操作,几乎所有用命令行能完成的工作都可以在这个交互界面上完成,直观而方便。


官方文档

Docker Swarm
Docker Stark
Compose File Documentation



相关 [docker swarm stack] 推荐:

How to configure autoscaling on docker swarm? - Stack Overflow

- -
This will involve a lot of scripting but the idea is to monitor the cluster for CPU / Memory / Network usage (with.

基于 Consul 的 Docker Swarm 服务发现

- - IT瘾-dev
基于 Consul 的 Docker Swarm 服务发现. 2017 年 1 月 10 日发布. Docker 是一种新型的虚拟化技术,它的目标在于实现轻量级操作系统的虚拟化. 相比传统的虚拟化方案,Docker. 虚拟化技术有一些很明显的优势:启动容器的速度明显快于传统虚拟化技术,同时创建一台虚拟机占用的资源也要远远小于传统的虚拟技术.

Docker Swarm - 服务发现和负载均衡原理 - 简书

- -
本文将介绍基于 DNS 的负载均衡、基于 VIP 的负载均衡和路由网格(Routing Mesh). Docker 使用了 Linux 内核 iptables 和 IPVS 的功能来实现服务发现和负载均衡. iptables 是 Linux 内核中可用的包过滤技术,它可用于根据数据包的内容进行分类、修改和转发决策.

Docker Swarm管理节点高可用分析 | Jalon'Blog

- -
SwarmKit构建的 Docker 引擎内置(原生)的集群管理和编排工具. 其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源. Swarm和Kubernetes比较类似,但是更加轻量,具有的功能也较kubernetes更少一些.

Traefik 实战(traefik+docker swarm) - 好脑袋和烂笔头 - OSCHINA

- -
    traefik是一个使你把微服务暴露出来变的更容易的http反向代理和负载均衡软件. traefik支持K8S、docker swarm、mesos、consul、etcd、zookeeper等基础设施组件,个人认为更适合容器化的微服务,traefik的配置会自动的、动态的配置更新自己. traefik的原理在另一篇讲解,本章直接实战看效果.

Stack Exchange 的架构

- Krevy - 酷壳 - CoolShell.cn
近日,Stack Exchange系统管理员blog上发布了一篇关于Stack Exchange的架构一瞥,其包括了Stack Overflow, Server Fault 和 Super User的 Stack Exchange 网络. 1 机柜 位于俄勒冈的 Peak Internet (用于chat 和Data Explorer).

Stack Overflow 的現況…

- - Gea-Suan Lin's BLOG
Stack Overflow 的 Nick Craver 貼出目前 Stack Overflow 的現況:「 What it takes to run Stack Overflow」. 公開出來的資料不包括 CDN 的部份,可以看出整個架構很精簡啊… 然後還貼出機房照片:. 可以看出很多機器都很大台,尤其是 RAM 的部份.

Docker & Flatpak

- - IT瘾-dev
目前最流行的技术莫过于Docker,Docker和Docker衍生的东西用到了很多很酷的技术,目前deepin应用软件发布转变成flatpak,这些看似风牛马不相及的技术方案,实际都使用了一个共同的底层技术——Namespace,假如没有namespace支持,这些技术实现都将成为空中楼阁. 一句话总结,无论是Docker、sysmted-nspawn还是flatpak,都是在namespace基础上,针对不同的场景,生出的不同的解决方案.

说说Stack Overflow和Quora

- corleone1969 - robbin的自言自语
今天看到一个新闻,Quora的中国克隆“知乎”得到了创新工场的投资. 我之前从创新工场的投资经理张亮那里要到了一个知乎邀请码,最近一直泡知乎,觉得Quora类的产品有很多创新的亮点,所以比较感兴趣这类产品,忍不住就谈谈. Stack Overflow(以下简称SO)和Quora虽然都是知识问答类的网站,但是他们有共同的成功基因,也有本质的差别.

Stack的三种含义

- - 阮一峰的网络日志
学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要. 容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分. stack的第一种含义是一组数据的 存放方式,特点为LIFO,即后进先出(Last in, first out).