Docker容器技术之swarm集群的搭建

本文介绍了Docker Swarm的基本概念和工作原理,详细讲解了如何搭建Swarm集群,包括初始化集群、添加节点、部署服务群集、进行负载均衡测试、滚动更新及高可用性测试。通过实验环境展示了在Swarm模式下如何实现容器的编排和管理。
摘要由CSDN通过智能技术生成

docker三剑客:swarm mesos k8s
一、知识剖析

Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in go, docker_py, docker等)均可以直接与Swarm通信。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息
下面是Swarm的结构图
在这里插入图片描述

swarm集群
使用的是docker自带的swarm mode,也就是docker集群的管理和编排。所谓的编排就是指多台集群的管理, 主机的配置,容器的调度等。
swarm mode是docker engine中自带的一种模式,很容易使用,并且无须安装其他的软件。 在使用swarm mode的时候,几台主机上都要先安装好docker。

二、swarm集群的搭建

实验环境:(安装docker并开启)

docker1:172.25.79.1 swarm
docker2: 172.25.79.2 node

在docker1上做初始化

[root@docker1 ~]# docker swarm init
Swarm initialized: current node (onmfjan5xiq2ek6vf6oalpvqp) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
##注意:在当前主机上启动swarm模式,要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥

docker1和docker2加入swarm集群中

[root@docker2 ~]# docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377
 [root@docker3 ~]# docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377
- 查看节点状态
[root@server1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
o4abf7l821zrls2aa1m4cj7pu    server3   Ready   Active        
u5mihispcziw1svmyjh9jx9g2 *  server1   Ready   Active        Leader
zrkp0dz7mzef7f6f5j08ec0c1    server2   Ready   Active 

都导入nginx镜像

[root@docker1 ~]# docker load -i nginx.tar 
[root@docker2 ~]# docker load -i nginx.tar 
[root@docker3 ~]# docker load -i nginx.tar 

部署一个服务群集

[root@docker1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9899107ae90e        bridge              bridge              local
076f11525d73        docker_gwbridge     bridge              local
3281f4c216de        host                host                local
i47byuadtg61        ingress             overlay             swarm
6b89c5ac48c1        none                null                local

[root@docker1 ~]# docker network create -d overlay my_net1
a8gg980w0j9s5ilmsffms9sbw

##在manager节点部署nginx服务,服务数量为3个 ,使用nginx镜像
[root@docker1 ~]# docker service create --name web --network my_net1 publish 80:80 --replicas 30 nginx

[root@docker1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ey3kgh65bp2g        web                 replicated          3/3                 nginx:latest        *:80->80/tcp

编写测试页面

[root@docker1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
8b6c0052888f        nginx:latest        "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp               web.2.6x5cwmlgodu8v5yx5961nry80
[root@docker1 ~]# vim index.html
server1
[root@docker1 ~]# docker cp index.html 8b6c0052888f:/usr/share/nginx/html

##docker2,docker3同理

测试负载均衡( 测试的时候把真机火墙关掉 )

[root@server1 ~]# for i in {1..10}; do curl 172.25.79.1; done
server3
server3
server2
server1
server2
server1
server3
server3
server2
server1
[root@server1 ~]# docker service ps nginx
ID            NAME     IMAGE  NODE     DESIRED STATE  CURRENT STATE           ERROR  PORTS
j939nrzgr8do  nginx.1  nginx  server3  Running        Running 9 seconds ago          
st431kqieqod  nginx.2  nginx  server1  Running        Running 10 seconds ago         
tr263kopgsbo  nginx.3  nginx  server2  Running        Running 9 seconds ago  

添加 6 个nginx 服务

[root@server1 ~]#  docker service scale nginx=6
unable to pin image nginx to digest: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 114.114.114.114:53: read udp 172.25.79.1:37142->114.114.114.114:53: i/o timeout
nginx scaled to 6

##查看有6个nginx 进程是 Running :
[root@server1 ~]# docker service ps nginx
ID            NAME     IMAGE  NODE     DESIRED STATE  CURRENT STATE            ERROR  PORTS
j939nrzgr8do  nginx.1  nginx  server3  Running        Running 3 minutes ago           
st431kqieqod  nginx.2  nginx  server1  Running        Running 3 minutes ago           
tr263kopgsbo  nginx.3  nginx  server2  Running        Running 3 minutes ago           
zryz1niphg19  nginx.4  nginx  server1  Running        Preparing 6 seconds ago         
6mwqzfqg8f8o  nginx.5  nginx  server2  Running        Preparing 5 seconds ago         
x3ci0tq8ldh4  nginx.6  nginx  server3  Running        Preparing 5 seconds ago 

添加监控

导入镜像并创建监控

[root@docker1 ~]# docker load -i visualizer.tar 
[root@docker1 ~]# docker load -i nginx.tar
[root@docker1 ~]# docker service create \
  --name=viz \
  --publish=8080:8080/tcp \
  --constraint=node.role==manager \
  --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
  dockersamples/visualizer

查看监控和节点是否在线

[root@server1 docker]#  docker service ls
ID            NAME   MODE        REPLICAS  IMAGE
4cqg0b6nwe44  nginx  replicated  6/6       nginx
vydqo176ak6p  viz    replicated  1/1       dockersamples/visualizer
##注意:开启viz服务慢,需要不断刷新等待建立完成,出现1/1才成功

浏览器:输入172.25.19.1:8080,可以看到6个nginx的进程被平均分在了三台机子上

在这里插入图片描述

滚动更新

重新添加一个镜像

[root@docker1 ~]# docker load -i rhel7.tar 
[root@docker1 ~]# docker service update --image rhel7:v1 --update-delay 5s --update-parallelism 1 web     ##每隔五秒更新,每次更新一个机子

##docker  ps -aq | wc -l  ##可看到每个机子上开启了多少个(一般都是平均)

浏览器的监控镜像由nginx变成了rhel7
在这里插入图片描述

测试高可用
此时是在只有3个进程的基础上测试的

停掉一个node:

[root@docker2 share]# systemctl stop docker

此时的负载均衡就在server1和server3主机上实现

[root@docker1 ~]# for i in {1..10}; do curl 172.25.79.1; done
docker3
docker1
docker3
docker1
docker3
docker1
docker3
docker1
docker3
docker1

浏览器的监控显示server2故障,并且6个nginx进程被平均分到docker1和docker上
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值