前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker Swarm入门:集群搭建与管理

Docker Swarm入门:集群搭建与管理

作者头像
KenTalk
发布2023-05-27 16:19:33
8930
发布2023-05-27 16:19:33
举报
文章被收录于专栏:Ken的杂谈Ken的杂谈

一、前言

Docker Swarm是Docker官方提供的容器集群管理以及容器编排解决方案,Docker Swarm基于Docker Compose组件以及网络等基础能力,提供了服务编排、负载均衡、动态伸缩、滚动更新等能力,本文ken.io主要介绍Docker Swarm基本概念、集群搭建与基础使用~

1、本文主要内容

  • Docker Swarm基本概念
  • Docker Swarm集群搭建
  • Docker Swarm集群管理
  • Docker Swarm基础使用

2、本文环境信息

环境

说明

Docker

Docker CE 23.0.1

Linux Server

CentOS 7.x

Golang

1.20

Windows

Windows 11

curl for Windows

7.87

3、前置知识

二、Docker Swarm基本概念

1、Docker Swarm 节点介绍

Docker Swarm一共有两种节点:管理节点(Manager Node) 和工作节点 (Worker Node)

  • 管理节点(Manager Node):用于Swarm集群的管理,Manager节点可以有1个或者多个,通常由3个以上的奇数Manger节点构成Manager集群,Manager节点中的主节点(Leader节点)选举通过Raft协议实现
  • 工作节点(Worker Node):用于执行Manager节点下发的任务:部署服务、扩容服务、更新服务等等

管理节点本身也是工作节点,在测试时可以不做区分,不过在生产环境可以通过deploy相关参数指定服务部署的节点类型

2、Docker Swarm服务和任务介绍

服务(Service):一个应用(镜像)的一个或者多个容器实例的统称,也可以说是一组任务的统称

任务(Task):服务的一个容器实例,是构成服务的最小逻辑单元

3、Docker Swarm 网络介绍

Docker Swarm集群创建时会初始化一个名为ingress的overlay类型的网络,用于管理管理和路由在Docker Swarm集群中运行的服务的入口流量。通过ingress网络,可以将外部请求路由到Docker Swarm集群中的服务,对于部署了多个实例(任务)的服务,ingress网络中的load balancer提供了负载均衡的能力,支持轮询、源IP哈希等负载均衡策略,另外Docker Swarm也通过ingress网络打通了不同节点部署的容器之间的网络访问

三、Docker Swarm集群部署

1、环境准备

准备3-5台虚拟机,其中1-3台为管理节点,2台为工作节点

Docker Swarm集群有1个Manager节点也能满足基本要求,为了Manager节点高可用可以部署3个及以上的奇数节点

机器名

IP

必要

操作系统

环境信息

swarm-manager-01

192.168.99.131

openEuler 22.03 LTS /CentOS 7

Docker CE 23.0.1

swarm-manager-02

192.168.99.132

openEuler 22.03 LTS /CentOS 7

Docker CE 23.0.1

swarm-manager-03

192.168.99.133

openEuler 22.03 LTS /CentOS 7

Docker CE 23.0.1

swarm-worker-01

192.168.99.141

openEuler 22.03 LTS /CentOS 7

Docker CE 23.0.1

swarm-worker-02

192.168.99.142

openEuler 22.03 LTS /CentOS 7

Docker CE 23.0.1

参考Docker入门:Docker安装与基本使用 - Ken的杂谈在各个节点上安装Docker

为了方便后续测试,请开放以下端口

  • 2377 用于与管理节点之间进行通信(TCP)
  • 7946 用于overlay网络节点发现(TCP&UDP)
  • 4789 用于overlay网络节通信(TCP)
  • 8000 用于部署服务测试(TCP)
代码语言:javascript
复制
firewalld-cmd --add-port=2377/tcp --permanent
firewalld-cmd --add-port=7946/tcp --permanent
firewalld-cmd --add-port=7946/udp --permanent
firewalld-cmd --add-port=4789/tcp --permanent
firewalld-cmd --add-port=8000/tcp --permanent
firewalld-cmd --reload

或者选择关闭防火墙

代码语言:javascript
复制
systemctl stop firewalld
systemctl disable firewalld

2、 初始化Swarm集群

在swarm-manager-01节点上执行初始化命令

代码语言:javascript
复制
# 初始化
docker swarm init

# 输出示例
Swarm initialized: current node (1dayw2jss8e7pseq1dxaufo7s) is now a manager.

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

    docker swarm join --token SWMTKN-1-0dm85ix64fa5j62hricif97kds21jj4aharkoqfuzfw22n10mc-9tlq05a1xafxnqtujj94t288k 10.0.10.131:2377

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

如果服务器有多个网卡,可以在初始化时手动指定IP

代码语言:javascript
复制
docker swarm init --advertise-addr 10.0.10.131

初始化之后,当前节点就默认成了管理节点,初始化成功后,会给出加入Swarm集群的命令信息 docker swarm join ……

默认给出的命令使用的是以Worker节点加入集群的的Token,可以通过明明获取Manager节点的命令&Token

代码语言:javascript
复制
# 获取Manager节点加入命令
docker swarm join-token manager

# 获取Worker节点加入命令
docker swarm join-token worker

3、节点加入

在swarm-manager-02、swarm-manager-03节点执行以下命令,作为Manager节点加入Swarm集群

代码语言:javascript
复制
# Manager节点加入命令
docker swarm join --token SWMTKN-1-0dm85ix64fa5j62hricif97kds21jj4aharkoqfuzfw22n10mc-880wdvlcnwgaa0n1jb5b326yr 10.0.10.131:2377

Manager节点只有1个也可以管理整个Swarm集群,是否增加信的Swarm节点,根据自己情况决定

在swarm-worker-01、swarm-worker-02节点执行以下命令,作为Worker节点加入Swarm集群

代码语言:javascript
复制
# Worker节点加入命令
docker swarm join --token SWMTKN-1-0dm85ix64fa5j62hricif97kds21jj4aharkoqfuzfw22n10mc-9tlq05a1xafxnqtujj94t288k 10.0.10.131:2377

三、Docker Swarm部署测试

Docker Swarm服务可以通过命令进行管理,管理命令如非专门说明,默认在Manager节点执行

1、部署服务

在Docker入门文章:构建支持多系统架构的Docker镜像 中有相关的测试代码已经制作镜像上传到了Docker Hub,这里可以用来做Docker Swarm的服务部署测试

代码语言:javascript
复制
# 拉取镜像
docker pull kentalk/helloworld

# 创建服务
docker service create --replicas 1 --name myhello -p 8000:8000 kentalk/helloworld

# 输出示例
bqxt6xxust47q9fhkcf0g48tf
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged

2、查看服务

代码语言:javascript
复制
# 查看所有已部署服务
docker service ls

# 输出示例
ID             NAME      MODE         REPLICAS   IMAGE                       PORTS
bqxt6xxust47   myhello   replicated   1/1        kentalk/helloworld:latest   *:8000->8000/tcp

# 查看指定服务包含的实例(任务)
docker service ps myhello

# 输出示例
ID             NAME            IMAGE                       NODE               DESIRED STATE   CURRENT STATE          ERROR                              PORTS
d1tffihdrsnt   myhello.1       kentalk/helloworld:latest   swarm-manager-01   Running         Running 2 hours ago 

# 查看服务详情
docker service inspect myhello
docker service inspect --pretty myhello

3、访问服务

Docker Swarm内置了load balancer,访问Docker Swarm集群任意节点都可以访问到该服务

代码语言:javascript
复制
curl 192.168.99.131:8000
curl 192.168.99.141:8000

#输出示例
Hello, World!  ---ken.io
OS:linux/arm64,Host:b0fd349db829,IP:10.0.0.7,172.18.0.3

从返回的HostName可以看出,无论是通过哪个节点访问,都是经过load balancer转发到了具体的容器上,返回的HostName是不变的

4、扩缩容服务

代码语言:javascript
复制
# 由于测试镜像较大,如果网络不稳定,可以在扩容前先在各个节点把镜像拉取完整,再执行扩容
docker pull kentalk/helloworld

# 把myhello服务扩容至3个实例(任务)
docker service scale myhello=3
# 输出示例
myhello scaled to 3
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 

# 把myhello服务缩容至2个实例(任务)
docker service scale myhello=2
# 输出示例
myhello scaled to 2
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged

5、部署服务时指定节点

Docker Swarm默认可以使用所有Manager、Worker节点部署服务,这个节点选择是随机的,不过我们可以通过—-constraint参数制定节点类型

5.1、使用Manager节点部署服务

代码语言:javascript
复制
# 使用Manager节点创建服务
docker service create --replicas 1 --name myhello -p 8000:8000 --constraint 'node.role==manager' kentalk/helloworld

# 使用Manager节点扩缩容服务
docker service scale myhello=3 --constraint 'node.role==manager'

5.1、使用Worker节点部署服务

代码语言:javascript
复制
# 使用Manager节点创建服务
docker service create --replicas 1 --name myhello -p 8000:8000 --constraint 'node.role==worker' kentalk/helloworld

# 使用Manager节点扩缩容服务
docker service scale myhello=3 --constraint 'node.role==worker'

四、Docker Swarm集群管理

Docker Swarm集群可以通过命令进行管理,通常管理命令只能在Manager节点执行,退出集群等命令可以在Worker节点执行

1、查看集群状态

代码语言:javascript
复制
docker node ls

# 输出示例
ID                            HOSTNAME           STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
1dayw2jss8e7pseq1dxaufo7s *   swarm-manager-01   Ready     Active         Leader           23.0.1
vghhihro3jiz60lstbsslh4ud     swarm-worker-01    Ready     Active                          23.0.1
8570e4bjeuj925nudu7o1a2h8     swarm-worker-02    Ready     Active                          23.0.1

2、查看服务信息

代码语言:javascript
复制
# 查看所有服务
docker service list

# 查看服务详情
docker service inspect {servicename}

3、退出集群

代码语言:javascript
复制
# Manager节点退出集群
docker swarm leave --force

# Worker节点退出集群
docker swarm leave
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-05-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
    • 1、本文主要内容
      • 2、本文环境信息
        • 3、前置知识
        • 二、Docker Swarm基本概念
          • 1、Docker Swarm 节点介绍
            • 2、Docker Swarm服务和任务介绍
              • 3、Docker Swarm 网络介绍
              • 三、Docker Swarm集群部署
                • 1、环境准备
                  • 2、 初始化Swarm集群
                    • 3、节点加入
                    • 三、Docker Swarm部署测试
                      • 1、部署服务
                        • 2、查看服务
                          • 3、访问服务
                            • 4、扩缩容服务
                              • 5、部署服务时指定节点
                              • 四、Docker Swarm集群管理
                                • 1、查看集群状态
                                  • 2、查看服务信息
                                    • 3、退出集群
                                    相关产品与服务
                                    容器镜像服务
                                    容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                                    http://www.vxiaotou.com