前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Docker Swarm群集配置实战——第一战

Docker Swarm群集配置实战——第一战

作者头像
小手冰凉
发布于 2020-08-17 08:29:17
发布于 2020-08-17 08:29:17
1.5K00
代码可运行
举报
文章被收录于专栏:小手冰凉小手冰凉
运行总次数:0
代码可运行

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

Docker Swarm集群中有三个角色:manager(管理者);worker(实际工作者)以及service(服务)。

在上面的三个角色中,其本质上与我们公司的组织架构类似,有领导(manager),有搬砖的(worker),而领导下发给搬砖者的任务,就是Docker Swarm中的service(服务)。

需要注意的是,在一个Docker Swarm群集中,每台docker服务器的角色可以都是manager,但是,不可以都是worker,正所谓蛇无头不行,不可以群龙无首,并且,参与群集的所有主机名,千万不可以冲突。

一、环境准备

主机名

IP

服务

node01

192.168.171.151

docker、manager

node02

192.168.171.150

docker、worker

node03

192.168.171.152

docker、worker

二、配置主机node01

以下操作,将初始化一个Swarm群集,并指定node01的角色为manager

代码语言:javascript
代码运行次数:0
运行
复制
[root@node01 ~]# ssh-keygen               # 在node01上配置免密登录
[root@node01 ~]# tail -3 /etc/hosts
#三台主机之间要互相解析(Swarm群集也需要此配置)
192.168.171.151 node01
192.168.171.150 node02
192.168.171.152 node03
[root@node01 ~]# ssh-copy-id node02          # 将生成的秘钥发送到node02
[root@node01 ~]# ssh-copy-id node03
[root@node01 ~]# scp /etc/hosts node02:/etc/   #将hosts文件发送到node02
[root@node01 ~]# scp /etc/hosts node03:/etc/   #将hosts文件发送到node03
#初始化一个集群,并指定自己为manager
[root@node01 ~]# docker swarm init --advertise-addr 192.168.171.151 

指定自己为manager初始化一个群组后,则会随着命令的执行成功而返回一系列的提示信息,这些提示信息给出的是,如果其他节点需要加入此节点,需要执行的命令,直接对其进行复制,然后,在需要加入此群集的主机上执行,即可成功加入群集。

返回的提示信息如下

三、配置node02及node03加入Swarm群集

代码语言:javascript
代码运行次数:0
运行
复制
#node02配置如下
[root@node02 ~]# docker swarm join --token SWMTKN-1-0s0r2bdyx0j9jmyrj0yn94vjzqs4gk21h6puszkfn8xoxoc2os-33amoli3h3zsk1k0982w93p07 192.168.171.151:2377
This node joined a swarm as a worker.
#node03配置如下
[root@node03 ~]# docker swarm join --token SWMTKN-1-0s0r2bdyx0j9jmyrj0yn94vjzqs4gk21h6puszkfn8xoxoc2os-33amoli3h3zsk1k0982w93p07 192.168.171.151:2377
This node joined a swarm as a worker.
[root@node01 ~]# docker node promote node02            # 将node02从worker升级为manager

node02及03便以worker的角色加入到了群集当中

若node02或者node03要脱离这个群集,那么需要以下配置(这里以node03为例)

代码语言:javascript
代码运行次数:0
运行
复制
[root@node03 ~]# docker swarm leave 
[root@node01 ~]# docker node rm node03           # 在manager角色的服务器上移除node03
[root@node01 ~]# docker swarm leave -f         
#若是最后一个manager上进行删除群集,则需要加“-f”选项
#最后一个删除后,这个群集也就不存在了

四、搭建registry私有仓库

在docker Swarm群集中,私有仓库并不影响其群集的正常运行,只是公司的生产环境多数都是自己的私有仓库,所以这里模拟一下。

代码语言:javascript
代码运行次数:0
运行
复制
#运行一个registry仓库容器
[root@node01 ~]# docker run -d --name registry --restart always -p 5000:5000 registry
[root@node01 ~]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -H unix:// --insecure-registry 192.168.171.151:5000          #定位到改行,指定私有仓库IP及端口
[root@node01 ~]# systemctl daemon-reload         # 重新加载配置文件
[root@node01 ~]# systemctl restart docker         # 重启使之生效
#node02及node03也需要指定私有仓库的位置,所以执行下面的命令将更改后的docker配置文件复制过去
[root@node01 ~]# scp /usr/lib/systemd/system/docker.service node02:/usr/lib/systemd/system/         
[root@node01 ~]# scp /usr/lib/systemd/system/docker.service node03:/usr/lib/systemd/system/
#将docker的配置文件复制过去以后,需要重启node02及03的docker服务
[root@node02 ~]# systemctl daemon-reload
[root@node02 ~]# systemctl restart docker

私有仓库创建完成,测试是否可以正常使用

代码语言:javascript
代码运行次数:0
运行
复制
#node01将nginx镜像上传到私有仓库
[root@node01 ~]# docker tag nginx:latest 192.168.171.151:5000/zyz:latest
[root@node01 ~]# docker push 192.168.171.151:5000/zyz:latest 
#在node02上进行下载,测试是否可以正常下载
[root@node02 ~]# docker pull 192.168.171.151:5000/zyz:latest

在上面搭建私有仓库的过程,并没有实现数据的持久化,若需要基于数据持久化搭建私有仓库,可参考

五、node01部署docker Swarm群集的web UI界面

代码语言:javascript
代码运行次数:0
运行
复制
[root@node01 ~]# docker run -d -p 8000:8080 -e HOST=172.16.171.151 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock  --name visualizer  dockersamples/visualizer
#执行上述命令后,即可客户端访问其8000访问,可以看到群集内的节点信息
#若节点发生故障,则会立即检测到

访问node01的8000端口,即可看到以下界面,注意:该界面只能看,不能进行任何配置

docker Swarm的群集到这也算是基本完善了,接下来,开始展示该群集,究竟可以做些什么?也就是到了配置其service服务阶段。

六、docker Swarm群集的service服务配置

1、在node01(必须在manager角色的主机)上,发布一个任务,使用刚刚测试时上传的nginx镜像,运行六个容器

代码语言:javascript
代码运行次数:0
运行
复制
[root@node01 ~]# docker service create --replicas 6 --name zyz -p 80 192.168.171.151:5000/zyz:latest 
#“--replicas”选项就是用来指定要运行的容器数量

创建完成返回信息如下

当运行六个容器副本后,可以查看群集的web UI界面,显示如下

注意:node03并没有下载相应的镜像,但是也会运行nginx服务,那么就可以得出一个结论:若docker主机没有指定的镜像,那么它将会自动去下载相应的镜像

可以看到,在进行上述配置后,群集中的三台服务器基于nginx镜像运行了两个容器,共六个

代码语言:javascript
代码运行次数:0
运行
复制
[root@node01 ~]# docker service ls 
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
qjqr2to6e4m1        zyz                 replicated          6/6                 192.168.171.151:5000/zyz:latest   *:30000->80/tcp

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

何为扩容?何为缩容?无非就是在容器无法承担当前负载压力的情况下,扩增几个一样的容器,缩容呢?也就是在大量容器资源闲置的情况下,减少几个一样的容器而已。

1、下面是针对上述创建的6个nginx服务的容器的扩容及缩容

1)容器的扩容

代码语言:javascript
代码运行次数:0
运行
复制
[root@node01 ~]# docker service scale zyz=9         
 # 将运行的nginx容器扩容到9

扩容后,其web UI界面显示如下

2)容器的缩容

代码语言:javascript
代码运行次数:0
运行
复制
#将9个nginx服务的容器缩减到3[root@node01 ~]# docker service scale zyz=3

缩容后,其UI界面显示如下

2、设置某个docker服务器不运行容器

在上述的配置中,若运行指定数量的容器,那么将是群集中的所有docker主机进行轮询的方式运行,直到运行够指定的容器数量,那么,如果不想让node01这个manager角色运行容器呢?(公司领导也不会去一线搬砖的嘛),可以进行以下配置:

代码语言:javascript
代码运行次数:0
运行
复制
[root@node01 ~]# docker node update --availability drain node01
node01
#设置主机node01以后不运行容器,但已经运行的容器并不会停止
# “--availability”选项后面共有三个选项可配置,如下
# “active”:工作;“pause”:暂时不工作;“drain”:永久性的不工作

当node01不在运行容器后,他之前所运行的容器并不会就此停止,会以轮询的方式运行到其他群集中的服务器上

附加——docker Swarm群集常用命令

代码语言:javascript
代码运行次数:0
运行
复制
[root@docker01 ~]# docker node ls    #查看群集的信息(只可以在manager角色的主机上查看)
[root@docker01 ~]# docker swarm join-token worker      #如果后期需要加入worker端,可以执行此命令查看令牌(也就是加入时需要执行的命令)
[root@docker01 ~]# docker swarm join-token manager         #同上,若要加入manager端,则可以执行这条命令查看令牌。
[root@docker01 ~]# docker service scale web05=6    #容器的动态扩容及缩容
[root@docker01 ~]# docker service ps web01       #查看创建的容器运行在哪些节点
[root@docker01 ~]# docker service ls        #查看创建的服务
#将docker03脱离这个群集
[root@docker03 ~]# docker swarm leave        #docker03脱离这个群集
[root@docker01 ~]# docker node rm docker03         #然后在manager角色的服务器上移除docker03
[root@docker01 ~]# docker node promote docker02    #将docker02从worker升级为manager。
#升级后docker02状态会为Reachable
[root@docker01 ~]# docker node demote docker02    #将docker02从manager角色降级为worker
[root@docker01 ~]# docker node update --availability drain docker01
#设置主机docker01以后不运行容器,但已经运行的容器并不会停止
[root@docker01 ~]# docker node update --label-add mem=max docker03
#更改docker03主机的标签为mem=max
[root@docker01 ~]# 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标签的主机上运行

docker Swarm总结

  • 参与群集的主机名一定不能冲突,并且可以互相解析对方的主机名;
  • 集群内的所有节点可以都是manager角色,但是不可以都是worker角色;
  • 当指定运行的镜像时,如果群集中的节点本地没有该镜像,那么它将会自动下载对应的镜像;
  • 当群集正常工作时,若一个运行着容器的docker服务器发生宕机,那么,其所运行的所有容器,都将转移到其他正常运行的节点之上,而且,就算发生宕机的服务器恢复正常运行,也不会再接管之前运行的容器;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Docker Swarm群集配置实战——第二战
注:这篇博文的环境基于上一篇博文中搭建的环境,具体可以参考博文:Docker Swarm群集配置实战
小手冰凉
2020/08/17
1.6K0
docker 配置Consul+registrator实时服务发现
Consul是用于服务发现和配置的工具。 Consul是分布式的,高度可用的,并且具有极高的可伸缩性。
小手冰凉
2020/08/17
8880
Docker 命令总结
一、Docker的基础命令 [root@node02 ~]# docker volume prune -f #删除无主的数据卷 #在运行容器时,-v挂载目录时没有指定本地要挂载的目录,而是由docker管理的, #当容器删除后,这些目录并不会被删除,此时这种目录就是无主数据卷。 #若要在删除容器时,同时删除这些数据卷,可以使用以下命令(添加“-v”选项即可): [root@node02 ~]# docker rm -f -v 8086 #其中8086为容器ID [root@
小手冰凉
2020/08/02
4790
Docker 部署Registry私有仓库+Harbor私有仓库
有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一 个本地仓库供私人使用。 两种不同的搭建Docker私有仓库的方法,都必须要基于一个Docker服务器上,相比较而言,Harbor功能更强大些。 之前详细写过Registry私有仓库的搭建方法,这里的Registry只是有一点配置不一样而已,若要搭建Registry私有仓库,最好结合:Docker 镜像的创建与构建私有库,对比其不一样的地方,选择适合自己的。
小手冰凉
2020/08/05
1.8K0
Docker 部署Registry私有仓库+Harbor私有仓库
Centos7搭建Kubernetes集群
Kubernetes 及其整个生态系统(工具、模块、插件等)均使用 Go 语言编写,从而构成一套面向 API、可高速运行的程序集合,这些程序文档精良、易于参与贡献或在其上构建应用程序。(百度百科)
润森
2020/04/30
9270
Centos7搭建Kubernetes集群
Docker Swarm
主机 IP 主机名 角色 192.168.1.10 master manager 192.168.1.20 node01 node 192.168.1.30 node01 node 安装 Docker yum install docker-ce -y 安装 swarm docker pull swarm 创建swarm # 执行完成后,该节点会自动加入到 swarm 集群,并创建一个 token docker swarm init --advertise-addr 192.168.1.10 dock
陳斯托洛夫斯記
2022/10/27
2650
部署 Consul服务实现Docker容器跨主机通信
consul 数据中心的含义,可以将其当做数据库来理解,类似于Redis等非关系型数据库,采用的是键-值对的方式,存放着各个容器的IP及端口信息。 consul的功能很强大,可以以群集的方式运行,并且具备健康监测等功能。
小手冰凉
2020/08/05
2.7K2
部署 Consul服务实现Docker容器跨主机通信
史上最强hadoop分布式集群的搭建
原文首发CSDN:https://blog.csdn.net/weixin_44510615/article/details/104625802
润森
2020/03/12
6380
Docker Swarm
Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker
李昂君
2021/12/24
8230
Docker Swarm
Docker和k8s的故障排除和监控利器 Weave-Scope服务
Weave-Scope服务是一个用来监控docker容器、k8s等(包括宿主机)的资源使用状况的,从根本上来说,有些类似于Zabbix等监控服务,该服务式基于容器部署的,部署简单,但功能强大,美中不足的可能就是其安全方面存在一些隐患吧! 一、部署Weave-Scope
小手冰凉
2020/08/17
6780
Docker Swarm学习笔记(一)
Docker Swarm概述 Docker Swarm是Docker官方提供的集群工具。它可以将一些关联的Docker主机转变成一个虚拟Docker主机。因为Docker Swarm符合Docker API的标准,任何已经可以与Docker守护进程通信的工具都可以使用Swarm来透明地扩展到多个主机。支持工具包括: Dokku Docker Compose Docker Machine Jenkins 当然,Docker客户端本身也是被支持的,而Docker Swarm支持的工具还不止这些。 如同其他的Do
小小科
2018/05/04
7860
Docker Swarm学习笔记(一)
Docker Swarm
本文档介绍了 Docker Swarm 集群的基本概念、工作原理以及相关命令使用示例,包括如何在服务调度中使用自定义标签。本文档适用于需要管理和扩展 Docker 容器化应用程序的生产环境场景。
误入歧途
2025/04/14
1070
快速入门Flink (2) —— Flink 集群搭建
上一篇博客博主已经为大家介绍了 Flink的简介与架构体系,本篇博客,我们来学习如何搭建Flink集群。
大数据梦想家
2021/01/27
2.6K0
快速入门Flink (2) —— Flink 集群搭建
完全分布式搭建HDFS分布式文件存储系统
准备至少3台机器(通过克隆虚拟机;配置好网络JDK 时间 hosts,保证节点间能互ping通)
全栈程序员站长
2022/06/28
8610
完全分布式搭建HDFS分布式文件存储系统
Redis 群集部署
一、Redis群集相关概念 Redis是从3.0版本开始支持cluter的,采用的是hash槽方式,可以将多个Redis实例整合在一起,形成一个群集,也就是将数据分散存储到群集中的多个节点上。
小手冰凉
2020/02/19
8320
Redis 群集部署
人生苦短,我用k8s--------------单节点二进制部署
etcd是CoreOS团队于2013年6月发起的开源项目,基于go语言开发,目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法。
不吃小白菜
2020/10/09
8680
搭建Hadoop集群
环境说明 redhat6.7 hadoop2.7 角色 主机名 IP master node01 192.168.6.71slave node02 192.168.6.72Slave node03 192.168.6.73 配置 vim /etc/hosts 192.168.6.71 node01
零月
2018/04/25
1.9K0
搭建Hadoop集群
K8S(V1.10.1)高可用集群超详细版本(包含Dashboard、Rancher)
六台主机配置、停防火墙、关闭Swap、关闭Selinux、设置内核、安装依赖包、配置ntp(配置完后建议重启一次)
全栈程序员站长
2022/06/29
3370
K8S(V1.10.1)高可用集群超详细版本(包含Dashboard、Rancher)
Docker的集群实战之Swarm模式
随着业务规模的扩大,一台机器的Docker已经无法满足我们的要求,为了保证性能和高可用,Docker提供了一种叫Swarm的解决方案。 他可以跨多个Docker主机来部署容器,具有完备的安全机制、内置负载均衡器;支持扩缩容、升级和回滚。 这次让我们用Swarm来部署一个2节点集群,并使用其负载均衡特性部署一个2副本Web应用。 何谓Swarm? 一个Swarm集群由一个或多个Docker节点组成。这些节点可以是物理机、虚拟机等。只要保证节点之间的网络通畅即可。Docker Swarm的结构如下:
腾讯云TStack
2019/08/09
1.8K0
Docker的集群实战之Swarm模式
ClickHouse集群搭建(二)
在上一章我们已经完成ClickHouse分布式集群安装,也创建本地表和分布式表进行了测试,但是,假如停掉一个节点会发生神马情况?
java干货
2021/02/15
1.6K0
相关推荐
Docker Swarm群集配置实战——第二战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验