10、Docker Swarm

1、 理解swarm

大家可以参照下图理解一下,之前,我们执行docker命令由对应的机器去执行,而现在多台机器组成swarm后,将多台docker服务器组成 了swarm,最后命令由swarm manager去执行。
在这里插入图片描述
这里再解释下:swarm 集群由管理节点(manager)和工作节点(work node)构成。
swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。

讲到这,同学们是不是感觉到跟redis一样?manager就相当于master,worker相当于slave
1、在Docker集群里,集群中的每台机器被称之为一个node,其中有一台机器是这个集群的管理者,称之为manager,其余的称之为worker。
2、在Redis集群里,也有一台机器是这个集群的管理者,称之为master,其余的称之为slave。
在这里插入图片描述
是不是一下子恍然大悟,就这么简单。

2、环境准备

2.1、环境准备
这里用两台机器来搭建,分别如下:
swarm01 192.168.0.101
swarm02 192.168.0.102

2.2、安装docker
每台机器上都需要安装Docker

yum search docker
yum install -y docker
systemctl start docker
systemctl status docker

2.3、加入开机自启

systemctl enable docker

2.4、更改docker的镜像源
刚安装完后,可能没有daemon.json,就需要先手动创建

vi /etc/docker/daemon.json

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}

然后重启

systemctl restart docker.service

2.5、修改主机名
然后分别修改两台机器的主机名,更改成swarm01,swarm02
在 192.168.0.101机器上执行

hostnamectl set-hostname swarm01

在 192.168.0.102机器上执行

hostnamectl set-hostname swarm02

2.6、关闭SELinux
两台机器分别执行下面语句

vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled 

2.7、编辑hosts文件
两台机器分别执行下面语句,设置两台主机的对应关系

vi /etc/hosts
192.168.0.101 swarm01
192.168.0.102 swarm02

2.8、关闭防火墙

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

2.9、修改docker监听端口
Swarm是通过监听2375端口进行通信的,所以在使用Swarm进行集群管理之前,需要设置一下2375端口的监听。所有主机节点docker开启2375监听,docker版本不同,配置方式不一样

vi /lib/systemd/system/docker.service

在ExecStar后t加入:

#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

2.10、重启docker服务

systemctl daemon-reload    ##使配置文件生效
systemctl restart docker

3、Swarm安装和集群创建

3.1、Swarm镜像下载
在两台机器上分别安装Swarm

[root@swarm01 fendo]# docker pull swarm
Using default tag: latest
latest: Pulling from library/swarm
dd72058debf0: Pull complete 
cb543654edaf: Pull complete 
44212202dc6d: Pull complete 
Digest: sha256:c97a27b020ae4439432c842769d8e731661d5987962e33004114e4aba9d03b4c
Status: Downloaded newer image for swarm:latest
[root@swarm01 fendo]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
swarm               latest              59c0df55980b        6 months ago        15.8MB

3.2、初始化Swarm
在swaram01机器上执行以下命令

[root@localhost docker]#  docker swarm init --advertise-addr  192.168.0.101
Swarm initialized: current node (nmwggq2i1dtoq4m4bzj7cokhx) is now a manager.

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

    docker swarm join --token SWMTKN-1-0ezh6smhyzx0bxzf11r4p0xjn33ozontwv14p4a1gl4qnzeep7-69sc3oaw7qocm4mm64avvpsne 192.168.0.101:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。

其中,–advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。

3.3、添加集群节点
然后在swaram02机器上执行以下命令

[root@localhost docker]# docker swarm join --token SWMTKN-1-0ezh6smhyzx0bxzf11r4p0xjn33ozontwv14p4a1gl4qnzeep7-69sc3oaw7qocm4mm64avvpsne 192.168.0.101:2377
This node joined a swarm as a worker.

3.4、查看集群节点
在swaram01机器上执行以下命令,swaram02是work节点,不允许操作

[root@localhost docker]# docker node list
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
nmwggq2i1dtoq4m4bzj7cokhx *   swarm01             Ready               Active              Leader
kc95j6fyd4fu4rp5feyht5uem     swarm02             Ready               Active 

3.5、查看集群信息
在这里插入图片描述

4、部署服务到集群中

注意:跟集群管理有关的任何操作,都是在管理节点上操作的。
以下例子,在一个工作节点上创建一个名为 eureka1的服务,这里是随机指派给一个工作节点:
***这里的register2镜像是我自己先上传的,其实就是一个eureka服务jar包。

[root@localhost docker]# docker service create --replicas 1 --name eureka1 register2
image register2:latest could not be accessed on a registry to record
its digest. Each node will access register2:latest independently,
possibly leading to different nodes running different
versions of the image.

ulzm1tmlt0bxx543sv5d0dlw8
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

5、查看服务部署情况

查看 eureka1服务运行在哪个节点上,可以看到目前是在 swarm-worker1 节点:

[root@localhost docker]# docker service ps eureka1
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
8d12mcs0i59s        eureka1.1           register2:latest    swarm01             Running             Running 25 seconds ago 

6、扩展集群服务

我们将上述的 eureka1服务扩展到俩个节点。

[root@localhost docker]# docker service scale eureka1=2
eureka1 scaled to 2
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 

再看服务已经从一个节点扩展到两个节点

[root@localhost docker]# docker service ps eureka1
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
8d12mcs0i59s        eureka1.1           register2:latest    swarm01             Running             Running 5 minutes ago                        
v25vz4pz1h43        eureka1.2           register2:latest    swarm02             Running             Running 36 seconds ago 

7、跟容器关系

先查看下docker进程
1、swarm1节点

[root@localhost docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                               NAMES
efb53477d2f9        register2:latest    "sh -c 'java -jar /a…"   7 minutes ago       Up 7 minutes              8761/tcp                            eureka1.1.8d12mcs0i59sm9s3cp9p9a5ya

2、swarm2节点

[root@localhost docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                               NAMES
5c824b132366        register2:latest    "sh -c 'java -jar /a…"   4 minutes ago       Up 4 minutes              8761/tcp                            eureka1.2.v25vz4pz1h43cx71cjowpi62d

3、在swarm1上再看服务

[root@localhost docker]# docker service ps eureka1
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
8d12mcs0i59s        eureka1.1           register2:latest    swarm01             Running             Running 5 minutes ago                        
v25vz4pz1h43        eureka1.2           register2:latest    swarm02             Running             Running 36 seconds ago 

有没有发现,service服务里node= swarm01 的ID等于8d12mcs0i59s,而swarm1节点的容器NAMES就是由docker服务名 + 节点号(从1开始递增)+ docker service的ID + 随机数组成。

参照文档
https://www.cnblogs.com/cjsblog/p/10778493.html
https://blog.csdn.net/u011781521/article/details/80468985

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值