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