Docker:Swarm + Stack 一站式部署容器集群_运维_Lunex的博客-CSDN博客
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
选项,其本身的意义并没有发生什么变化。但是,由于 volume
在 yml
文件中是以字符串的形式存在的,所以像$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