Docker swarm搭建(1)

Docker swarm

docker swarm集群:三剑客之一

一. Docker Swarm 的基本概念和原理

Docker Swarm 简介

Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用go语言来完成开发,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息.

Docker Swarm 工作原理

Docker 客户端通过 Docker API 向 Swarm 管理端发送请求,Swarm Manager 通过守护进程调用集群中的某个节点来执行任务。因为容器都是运行在节点上,Swarm 作为一个独立的集群管理工具,故并不会因某些原因导致不能正常工作而影响集群内所有节点的正常运行。当服务恢复正常后,Swarm 会读取日志来执行集群的恢复动作。架构图如图 1:

图 1.Docker Swarm 架构图

二. Docker Swarm要点

Swarm的负载非常低。据我观察,Swarm进行调度和通信的CPU负载非常低。因此,Swarm的管理节点(Manager)可以同时作为工作节点(Worker)。如果你需要搭建一个非常大的集群(1000+ 节点),管理节点需要更多资源,但是对于中小型集群来说,管理节点需要的资源可以忽略不计。

Swarm集群的网络通信(服务发现,负载均衡以及容器间通信)非常可靠。当你开启一个服务的端口之后,在Swarm集群中的任何一个节点都可以访问它。负载均衡也是由Swarm提供的。后文会提到一些之前遇到的问题,但是Docker 1.13之后,这些问题都解决了。

三. 实验环境

主机 IP地址 服务
docker01 192.168.1.11 swarm+overlay+webUI
docker02 192.168.1.13 nginx
docker03 192.168.1.20 nginx

三台主机都关闭防火墙,禁用selinux,修改主机名,时间同步,并添加域名解析。

docker版本必须是:v1.12版本开始(可使用docker version查看版本)

1.关闭防火墙,禁用selinux

[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# hostnamectl set-hostname docker03
[[email protected] ~]# su -

2.时间同步

mv /etc/localtime /etc/localtime.bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime

3.修改主机名(三台都要)

[[email protected] ~]# hostnamectl set-hostname docker01
[[email protected] ~]# su -

4.添加域名解析

[[email protected] ~]# vim  /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.11 docker01
192.168.1.13 docker02
192.168.1.20 docker03

四. swarm原理

swarm:作用运行docker engin的多个主机组成的集群

node:每一个docker engin都是一个node(节点),分为manager和worker。

manager node:负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,他们会自动协调并选举一个leader执行编排任务。但相反,不能没有manager node。

worker node:接受并执行由manager node派发的任务,并且默认manager node也是一个worker node,不过可以将它设置为manager-only node,让他只负责编排和管理工作。

service:用来定义worker上执行的命令。

基本命令操作

docker swarm leave:申请离开一个集群,之后查看节点状态会变成down,然后可通过manager node 将其删除
docker node rm xxx:删除某个节点

docker swarm join-token [manager|worker]:生成令牌,可以是manager或worker身份。

docker node demote(降级):将swarm节点的为manager降级为worker

docker node promote(升级):将swarm节点的work升级为manager

docker node ls:查看群集的信息(只可以在manager角色的主机上查看)

docker service scale web05=6:容器的动态扩容及缩容

docker service ps web01: 查看创建的容器运行在哪些节点

docker service ls: 查看创建的服务

docker swarm leave: 脱离这个群集

docker node rm docker03: 在manager角色的服务器上移除docker03

docker node update --availability drain docker01: 设置主机docker01以后不运行容器,但已经运行的容器并不会停止

docker node update --label-add mem=max docker03: 更改docker03主机的标签为mem=max

docker service update --replicas 8 --image 192.168.20.6:5000/lvjianzhao:v2.0 --container-label-add ‘node.labels.mem==max‘ lvjianzhao05: 将服务升级为8个容器,并且指定在mem=max标签的主机上运行

五. docker01 初始化集群

[[email protected] ~]# docker swarm init --advertise-addr 192.168.1.11

--advertise-addr:指定与其它docker通信的地址。

上边返回的结果告诉我们:初始化成功,并且,如果想要添加work节点运行下面的命令:

注意:token令牌只有24小时的有效期

上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。 其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。

如果想要添加manager节点:运行下面命令

六.swarm集群的简单操作

1.docker02和docker03以worker加入集群

[[email protected] ~]# docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h1n0pbokj-1e60wt0yr5583e4mzwbxnn3a8 192.168.1.11:2377

docker01查看集群

[[email protected] ~]# docker node ls

注意:这里的”*****“代表的是当前所属的节点

2.删除集群中节点

docker02和docker03申请离开一个集群
[[email protected] ~]# docker swarm leave 
docker删除docker02和docker03节点
[[email protected] ~]# docker node rm docker02
[[email protected] ~]# docker node rm docker03
docker01查看集群
[[email protected] ~]# docker node ls

3.docker02和docker03以manager加入集群

docker01生成manager令牌

[[email protected] ~]# docker swarm join-token manager 

docker02和docker03加入集群

docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h1n0pbokj-cz6hbyv9r5htyqwj5tfol65aa 192.168.1.11:2377

docker01查看集群

[[email protected] ~]# docker node ls

4.docker02和docker03降级

docker01(manager)把docker02和docker03降级成worker

[[email protected] ~]# docker node  demote docker02
[[email protected] ~]# docker node  demote docker03

查看集群

[[email protected] ~]# docker node ls

七. 部署docker swarm集群网络

overlay:覆盖型网络

overlay networks 管理Swarm中docker守护进程间的通信。可以将容器附加到一个或多个已存在的overlay网络上,使容器与容器之间能够通信;

[[email protected] ~]# docker network create -d overlay --attachable docker
//attachable:这个参数必须要加,否则不能用于容器。

在创建网络的时候,我们并没有部署一个存储服务,比如consul,那是因为docker swarm自带存储。

docker01查看网络

但是会发现其他两台并不会发现此网络,需等基于此网络创建service服务就可以看到了

[[email protected] ~]# docker network ls

八. docker01部署一个图形化webUI界面

1.docker01 导入镜像

[[email protected]~]# docker pull dockersamples/visualizer

2.基于镜像启动一台容器

[[email protected] ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.100 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualiaer  dockersamples/visualizer

3.通过浏览器访问验证http://192.168.1.11:8080/

如果访问不到网页,需开启路由转发

[[email protected] ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[[email protected] ~]# sysctl -p

九. 创建service(服务)

1. 基于nginx容器创建一个service服务

[[email protected] ~]#docker pull nginx
//下载nginx镜像(三台都要)
[[email protected] ~]# docker service create --replicas 1 --network  docker --name web1 -p 80:80 nginx:latest
[[email protected] ~]# docker service create --replicas 1 --network  docker --name web2 -p 80 nginx:latest 

//--replicas:副本数量

大概可以理解为一个副本等于一个容器

2. 查看创建的service服务

[[email protected] ~]# docker service ls

单独查看一个servicefuw
[[email protected] ~]# docker service  ps web1

[[email protected] ~]# docker service  ps web2

3. web界面查看

4. 基于nginx容器创建五个service服务

[[email protected] ~]# docker service create --replicas 5 --network  docker --name web -p 80 nginx:latest 
web界面查看

5. 挂起docker02

web查看(发现服务都分配到其他服务器了)

6. 恢复docker02

web查看(发现服务没有回到docker02)

十、实现docker容器的扩容及缩容

1. 删除web1和web2服务

[[email protected] ~]# docker service rm web1 web2

2. 容器的扩容和缩减

(1)扩容

[[email protected] ~]# docker service scale web=8

(2)缩减

[[email protected] ~]# docker service scale web=3

3.设置manager node不参加工作

[[email protected] ~]# docker node update docker01 --availability drain

设置主机docker01以后不运行容器,但已经运行的容器并不会停止
“--availability”选项后面共有三个选项可配置,如下:
“active”:工作;“pause”:暂时不工作;“drain”:永久性的不工作

[[email protected] ~]# docker node ls

web界面查看

十一、docker Swarm总结

在我对docker Swarm群集进行一定了解后,得出的结论如下:

  • 参与群集的主机名一定不能冲突,并且可以互相解析对方的主机名;
  • 集群内的所有节点可以都是manager角色,但是不可以都是worker角色;
  • 当指定运行的镜像时,如果群集中的节点本地没有该镜像,那么它将会自动下载对应的镜像;
  • 当群集正常工作时,若一个运行着容器的docker服务器发生宕机,那么,其所运行的所有容器,都将转移到其他正常运行的节点之上,而且,就算发生宕机的服务器恢复正常运行,也不会再接管之前运行的容器;

原文地址:https://blog.51cto.com/14320361/2462419

时间: 2024-08-03 16:15:29

Docker swarm搭建(1)的相关文章

使用Docker Swarm搭建分布式爬虫集群

在爬虫开发过程中,你肯定遇到过需要把爬虫部署在多个服务器上面的情况.此时你是怎么操作的呢?逐一SSH登录每个服务器,使用git拉下代码,然后运行?代码修改了,于是又要一个服务器一个服务器登录上去依次更新? 有时候爬虫只需要在一个服务器上面运行,有时候需要在200个服务器上面运行.你是怎么快速切换的呢?一个服务器一个服务器登录上去开关?或者聪明一点,在Redis里面设置一个可以修改的标记,只有标记对应的服务器上面的爬虫运行? A爬虫已经在所有服务器上面部署了,现在又做了一个B爬虫,你是不是又得依次

Docker swarm搭建(2)

什么是docker swarm? Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令.目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具.它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络. Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具

从零开始搭建Docker Swarm集群

从零开始搭建Docker Swarm集群 检查节点Docker配置 1. 打开Docker配置文件(示例是centos 7)vim /etc/sysconfig/docker 2. 添加-H tcp://0.0.0.0:2375到OPTIONSOPTIONS='-g /cutome-path/docker -H tcp://0.0.0.0:2375' 3. CentOS6.6 需要另外添加-H unix:///var/run/docker.sockOPTIONS='-g /mnt/docker 

Docker Swarm 环境搭建

Docker Swarm 环境搭建 swarm 使用前提 1.Docker版本1.12+ Docker升级教程:https://www.cnblogs.com/xiangsikai/p/9935894.html 2.集群节点之间保证如下端口通信: TCP 2377(管理节点与集群模式的通信manager与worker) TCP/UDP 7946(节点之前其他数据的传输) UDP 4789(overlay网络通信) 节点规划 系统:Centos 7.4 x64 应用版本:Docker 18.09.

Docker swarm 集群搭建

Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信.Swarm几乎全部用go语言来完成开发,上周五,4月17号,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来

Swarm搭建 Docker集群

一.环境准备 1.准备服务器如下: 172.19.230.69 node1 172.19.230.70 node2 172.19.230.64 node3 2.修改主机名: hostnamectl set-hostname node1 3.关闭防火墙 systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动 4.修改docker监听端口 vi /lib/syste

Docker Swarm群集

Docker Swarm 是什么? Docker Swarm是一个用于创建Docker主机(运行Docker守护进程的服务器)集群的工具,使用Swarm操作集群,会使用户感觉就像是在一台主机上进行操作 docker1.12集成了swarmkit, 使你可以不用安装额外的软件包, 使用简单的命令启动创建docker swarm集群. 如果你在运行 Docker 1.12时,你就可以原生创建一个 Swarm 集群 . 集成了swarm集群的安全特性, 集成了K-V存储, 你现在不需要额外部署etcd

docker swarm集群及其UI部署

一.规划 ①swarm01作为manager节点,swarm02和swarm03作为worker节点. # cat /etc/hosts 127.0.0.1   localhost 192.168.139.175  swarm01  192.168.139.176  swarm02  192.168.139.177  swarm03 ②配置SSH免密登陆 # ssh-keygen -t rsa -P '' # ssh-copy-id -i .ssh/id_rsa.pub [email prote

(转) Docker swarm - 使用体验 1+2

背景 凭借敏捷开发部署理念的推行,相信对于很多人来说docker这项容器技术已经并不陌生,Docker 1.12引擎发布了快两个月,新引擎中包含了许多特性.诸如: Swarm模式,容器集群的健康检查,节点的身份加密,docker Service API调用,容器启动的过滤匹配方式(constraint), docker的内建路由,以及支持在多平台系统上运行docker(MAC.Windows.AWS.AZURE),以及一些插件升级等等. 特性之多,就连Docker 自己的产品经理也表示这次的新版