Docker Swarm集群部署教程

时间:2024-10-04 06:59:12

Docker Swarm集群部署教程

  • 一、Docker Swarm介绍
    • 1.1 Docker Swarm简介
    • 1.2 Docker Swarm特点
    • 1.3 Docker Swarm架构图
  • 二、本地环境规划
  • 三、部署前准备工作
    • 3.1 检查Docker版本
    • 3.2 检查Docker的服务状态
    • 3.3 配置各节点的host
    • 3.4 设置selinux和防火墙
  • 四、安装Docker Swarm集群
    • 4.1 master节点操作
    • 4.2 node节点操作
    • 4.3 查看集群状态
    • 4.4 查看master节点信息
  • 五、节点的标签管理
    • 5.1 添加节点标签
    • 5.2 查询节点标签
    • 5.3 删除节点标签
  • 六、部署nginx测试服务
    • 6.1 集群的服务发布
    • 6.2 在集群中创建nginx服务
    • 6.3 查看nginx容器状态
    • 6.4 查看service列表
    • 6.5 查看service详细信息
  • 七、访问测试服务
    • 7.1 访问测试nginx服务
    • 7.2 查看本地转发规则
    • 7.3 docker swarm相关命令

一、Docker Swarm介绍

1.1 Docker Swarm简介

Docker Swarm是Docker公司开发的一个容器编排工具,它可以将多个Docker节点组成一个集群,从而实现容器的自动化管理、负载均衡、故障恢复等功能。Docker Swarm可以通过命令行或者API接口来进行操作,支持水平扩展和垂直扩展。

1.2 Docker Swarm特点

Docker Swarm 是 Docker 官方提供的容器编排和集群管理工具,其主要特点如下:

  • 简单易用:Docker Swarm 的使用和配置非常简单,用户无需学习新的技术或语言,只需通过简单的命令即可完成容器编排和管理。

  • 高可用性:Docker Swarm 提供了高可用性的容器编排和管理功能,可以自动对容器进行故障转移和容器重启,从而保证应用的高可用性。

  • 可扩展性:Docker Swarm 支持动态扩展容器,可以根据应用负载的变化自动扩展或缩减容器数量,从而保证应用的高可扩展性。

  • 安全性:Docker Swarm 提供了安全的容器编排和管理功能,可以对容器进行安全隔离和访问控制,从而保证应用的安全性。

  • 多种部署模式:Docker Swarm 可以支持多种不同的部署模式,包括单机模式、集群模式和混合模式,可以根据用户的需求选择最合适的部署模式。

1.3 Docker Swarm架构图

  • Manager 节点需要时刻维护和保存当前 Swarm 集群中各个节点的一致性状态,在保证一致性上,Manager 节点采用 Raft 协议来保证分布式场景下的数据一致性;
Manger 节点是负责管理工作的:

1. 维护集群的状态;
2. 对Services 进行调度;
3. 为Swarm 集群提供外部可调用的 API 接口;
4. 提供服务注册发现、负责均衡等功能;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • Worker Node:Worker 节点是用来执行 Task 的;默认情况下 Manager 节点也同样是 Worker 节点,同样可以执行 Task;

在这里插入图片描述

二、本地环境规划

  • 本地环境规划如下:
hostname IP地址 操作系统版本 Docker版本 角色
master 192.168.3.171 centos7.6 24.0.2 Manger节点
node01 192.168.3.172 centos7.6 24.0.2 Worker节点
node02 192.168.3.173 centos7.6 24.0.2 Worker节点

三、部署前准备工作

3.1 检查Docker版本

使用docker version检查各节点的Docker版本,以master节点为例。

[root@master ~]# docker version
Client: Docker Engine - Community
 Version:           24.0.2
 API version:       1.43
 Go version:        go1.20.4
 Git commit:        cb74dfc
 Built:             Thu May 25 21:55:21 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.2
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.4
  Git commit:       659604f
  Built:            Thu May 25 21:54:24 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.21
  GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
 runc:
  Version:          1.1.7
  GitCommit:        v1.1.7-0-g860f061
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3.2 检查Docker的服务状态

检查Docker服务状态,确保各节点的Docker服务正常启动。

[root@master ~]# systemctl status docker
●  - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-06-12 15:48:36 CST; 2min 14s ago
     Docs: 
 Main PID: 5144 (dockerd)
    Tasks: 10
   Memory: 35.2M

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.3 配置各节点的host

配置各节点的host文件

[root@master ~]# cat /etc/hosts
127.0.0.1   localhost  localhost4 localhost4.localdomain4
::1         localhost  localhost6 localhost6.localdomain6
192.168.3.171 master
192.168.3.172 node01
192.168.3.173 node02
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.4 设置selinux和防火墙

在所有节点进行操作

  • 关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
  • 1
  • 2
  • 关闭防火墙
 systemctl stop  && systemctl disable  
  • 1

或者在防火墙上放行相关端口

firewall-cmd --zone=public --add-port=2375-2377/tcp --add-port=2375-2377/udp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent
  • 1
 firewall-cmd --reload
  • 1

四、安装Docker Swarm集群

4.1 master节点操作

初始化Master节点,命令执行后,该机器自动加入到swarm集群。此时系统会创建一个集群token,得到唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。

docker swarm init --advertise-addr 192.168.3.171
  • 1

在这里插入图片描述

4.2 node节点操作

使用在master节点生成的token,将Node节点加入集群中。

  • node01节点加入swarm集群
docker swarm join --token SWMTKN-1-25w7slv3xrj0pa5voa1ym4upe6zcd1ym1l10hoffk6bpf2wkto-0ft7ev6m23h9tef5gjhxybom0 192.168.3.171:2377 
  • 1

在这里插入图片描述

  • node02节点加入swarm集群
docker swarm join --token SWMTKN-1-25w7slv3xrj0pa5voa1ym4upe6zcd1ym1l10hoffk6bpf2wkto-0ft7ev6m23h9tef5gjhxybom0 192.168.3.171:2377 
  • 1

在这里插入图片描述

4.3 查看集群状态

查看集群各节点状态

[root@master ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
z7l9x0omlm5cnwtakl8vppmma *   master     Ready     Active         Leader           24.0.2
3os3aj0vbxzkkfxivc7b869vy     node01     Ready     Active                          24.0.2
pw71108ljzb18ovyeva8iu73k     node02     Ready     Active                          24.0.2

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.4 查看master节点信息

查看master节点信息

[root@master ~]# docker node inspect master --pretty 
ID:			z7l9x0omlm5cnwtakl8vppmma
Hostname:              	master
Joined at:             	2023-06-12 07:57:15.210515621 +0000 utc
Status:
 State:			Ready
 Availability:         	Active
 Address:		192.168.3.171
Manager Status:
 Address:		192.168.3.171:2377
 Raft Status:		Reachable
 Leader:		Yes
Platform:
 Operating System:	linux
 Architecture:		x86_64
Resources:
 CPUs:			4
 Memory:		7.638GiB
Plugins:
 Log:		awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog
 Network:		bridge, host, ipvlan, macvlan, null, overlay
 Volume:		local
Engine Version:		24.0.2
TLS Info:
 TrustRoot:
-----BEGIN CERTIFICATE-----
MIIBazCCARCgAwIBAgIURQUnSufTO0UBYGBTbRTr5yFNGL0wCgYIKoZIzj0EAwIw
EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjMwNjEyMDc1MjAwWhcNNDMwNjA3MDc1
MjAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
A0IABCwMyu1i9F4mdIo0pcbc1AoBJ8R7/aaBWemnRYhuOvI/RX/QJuTl3GPzIwWb
BwcNDCwQ+2TY7s9m8rgSU0GgQAujQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBS7vkEbv7lbvdwz07XwUB/dDbi2kDAKBggqhkjO
PQQDAgNJADBGAiEAuEOcQPRSOP6XPFDIwg4168CFELvrI0QRlpnJRrCIG30CIQDj
GF9Ox48L/acW536Rli8kbStjyXVFWjWEnsrY5W6OhQ==
-----END CERTIFICATE-----

 Issuer Subject:	MBMxETAPBgNVBAMTCHN3YXJtLWNh
 Issuer Public Key:	MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELAzK7WL0XiZ0ijSlxtzUCgEnxHv9poFZ6adFiG468j9Ff9Am5OXcY/MjBZsHBw0MLBD7ZNjuz2byuBJTQaBACw==
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

查看node节点信息

[root@master ~]# docker node inspect node01 --pretty 
ID:			3os3aj0vbxzkkfxivc7b869vy
Hostname:              	node01
Joined at:             	2023-06-12 08:31:28.948323457 +0000 utc
Status:
 State:			Ready
 Availability:         	Active
 Address:		192.168.3.172
Platform:
 Operating System:	linux
 Architecture:		x86_64
Resources:
 CPUs:			6
 Memory:		11.68GiB
Plugins:
 Log:		awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog
 Network:		bridge, host, ipvlan, macvlan, null, overlay
 Volume:		local
Engine Version:		24.0.2
TLS Info:
 TrustRoot:
-----BEGIN CERTIFICATE-----
MIIBazCCARCgAwIBAgIURQUnSufTO0UBYGBTbRTr5yFNGL0wCgYIKoZIzj0EAwIw
EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjMwNjEyMDc1MjAwWhcNNDMwNjA3MDc1
MjAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
A0IABCwMyu1i9F4mdIo0pcbc1AoBJ8R7/aaBWemnRYhuOvI/RX/QJuTl3GPzIwWb
BwcNDCwQ+2TY7s9m8rgSU0GgQAujQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBS7vkEbv7lbvdwz07XwUB/dDbi2kDAKBggqhkjO
PQQDAgNJADBGAiEAuEOcQPRSOP6XPFDIwg4168CFELvrI0QRlpnJRrCIG30CIQDj
GF9Ox48L/acW536Rli8kbStjyXVFWjWEnsrY5W6OhQ==
-----END CERTIFICATE-----

 Issuer Subject:	MBMxETAPBgNVBAMTCHN3YXJtLWNh
 Issuer Public Key:	MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELAzK7WL0XiZ0ijSlxtzUCgEnxHv9poFZ6adFiG468j9Ff9Am5OXcY/MjBZsHBw0MLBD7ZNjuz2byuBJTQaBACw==

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

五、节点的标签管理

5.1 添加节点标签

在node01节点上添加标签

[root@master ~]# docker node update --label-add work01  node01
node01

  • 1
  • 2
  • 3

5.2 查询节点标签

查询node01节点上标签

 docker node inspect node01 --pretty
  • 1

在这里插入图片描述

5.3 删除节点标签

删除node01节点上标签

docker node update --label-rm work01 node01
  • 1

六、部署nginx测试服务

6.1 集群的服务发布

Worker节点是用来执行 Task 的;默认情况下 Manager 节点也同样是Worker 。

在这里插入图片描述

6.2 在集群中创建nginx服务

我们在Manager节点部署Nginx服务,副本数为两个,对外暴露端口为8666,映射的是容器内部的80端口,使用的是nginx:1.21镜像。

docker service create --replicas 2 --name myweb --publish 8666:80 nginx:1.21
  • 1

在这里插入图片描述

6.3 查看nginx容器状态

查看容器在集群中各节点分布状况

[root@master ~]# docker service ps myweb 
ID             NAME      IMAGE        NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
ujvrvc8m9u1b   myweb.1   nginx:1.21   node01    Running         Running 2 minutes ago             
3htd83ro9ayn   myweb.2   nginx:1.21   master    Running         Running 2 minutes ago    
  • 1
  • 2
  • 3
  • 4

6.4 查看service列表

查看service列表

[root@master ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE        PORTS
01tsoti1icg7   myweb     replicated   2/2        nginx:1.21   *:8666->80/tcp

  • 1
  • 2
  • 3
  • 4

6.5 查看service详细信息

查看myweb服务的详细信息

[root@master ~]# docker service inspect myweb --pretty 

ID:		01tsoti1icg7deoppdmshkre0
Name:		myweb
Service Mode:	Replicated
 Replicas:	2
Placement:
UpdateConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:		nginx:1.21@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
 Init:		false
Resources:
Endpoint Mode:	vip
Ports:
 PublishedPort = 8666
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

七、访问测试服务

7.1 访问测试nginx服务

访问测试nginx服务,在master节点和node01节点都可以正常访问到nginx服务。

[root@master ~]# curl 192.168.3.171:8666
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="/"></a>.<br/>
Commercial support is available at
<a href="/"></a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@master ~]# curl 192.168.3.172:8666
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="/"></a>.<br/>
Commercial support is available at
<a href="/"></a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

在这里插入图片描述

7.2 查看本地转发规则

iptables -nL -t nat使用以下命令,可以看到将请求转发到172.18.0.2:8666这个地址。

[root@master ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER-INGRESS  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER-INGRESS  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match src-type LOCAL

Chain DOCKER-INGRESS (2 references)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8666 to:172.18.0.2:8666

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

7.3 docker swarm相关命令

在docker swarm集群中,常用的命名如下。


docker service create --image nginx --replicas 2  nginx      # 创建服务                                     
docker service update --image nginx:alpine  nginx   # 更新服务
docker service rm nginx   # 删除服务
docker service scale nginx=1   # 指定服务实例为1个
docker service scale nginx=3   # 指定服务实例为为3个
docker service ls  # 查看所有服务
docker service ps nginx  # 查看服务的容器状态
docker service inspect nginx# 查看服务的详细信息。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9