Docker Swarm

IT
IT
IT
335
文章
1
评论
2020年3月23日18:16:06 评论 1,214 7083字阅读23分36秒

基本概念

Swarm是使用SwarmKit构建的 Docker 引擎内置(原生)的集群管理和编排工具。Docker Swarm是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。

使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm 集群具备与MesosKubernetes竞争的实力。使用 Swarm 集群之前需要了解以下几个概念。

节点

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。节点分为管理 (manager) 节点和工作 (worker) 节点

管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为leader,leader 通过raft协议实现。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。来自Docker官网的这张图片形象的展示了集群中管理节点与工作节点的关系。

Docker Swarm

服务和任务

任务(Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器;服务(Services)是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

  • replicated services按照一定规则在各个工作节点上运行指定个数的任务。
  • global services每个工作节点上运行一个任务

两种模式通过docker service create--mode参数指定。来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。

Docker Swarm

安装

  • 下载镜像
[xiaoxin@provider1 ~]$ sudo docker pull swarm
Using default tag: latest
latest: Pulling from library/swarm
d85c18077b82: Pull complete
1e6bb16f8cb1: Pull complete
85bac13497d7: Pull complete
Digest: sha256:b866583a3b8791bcd705b7bc0fd94c66b695a1a2dbaeb5f59ed29940e5015dc8
Status: Downloaded newer image for swarm:latest
docker.io/library/swarm:latest
[xiaoxin@provider1 ~]$ sudo docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
centoscn/centos7.4-jdk1.8   latest              55f7929b1738        41 hours ago        581MB
portainer/portainer         latest              ff4ee4caaa23        5 weeks ago         81.6MB
swarm                       latest              ff454b4a0e84        19 months ago       12.7MB

初始化swarm

[xiaoxin@provider1 ~]$ sudo docker swarm init --advertise-addr 10.1.1.82
Swarm initialized: current node (iqoigr0asgkeyocrtz4ovjw2h) is now a manager.
 
To add a worker to this swarm, run the following command:
 
    docker swarm join --token SWMTKN-1-4e36881zedy2d9vy45ax9kynmb4ajeisjk8inzjj7gd9jjqrne-0rv23q166bt8d7550dtdd7kdt 10.1.1.82:2377
 
	To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

查看集群相关信息

[xiaoxin@provider1 ~]$ sudo docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
iqoigr0asgkeyocrtz4ovjw2h *   provider1           Ready               Active              Leader              19.03.5

注意上面node ID旁边那个*号表示现在连接到这个节点上。

添加节点到swarm集群中

在docker swarm init 完了之后,会提示如何加入新机器到集群,如果当时没有注意到,也可以通过下面的命令来获知 如何加入新机器到集群。

  • 添加节点一
[xiaoxin@provider1 ~]$ sudo docker swarm join --token SWMTKN-1-4e36881zedy2d9vy45ax9kynmb4ajeisjk8inzjj7gd9jjqrne-0rv23q166bt8d7550dtdd7kdt 10.1.1.82:2377
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/swarm/join: dial unix /var/run/docker.sock: connect: permission denied

添加节点二

[xiaoxin@bgt-service ~]$ sudo docker swarm join --token SWMTKN-1-4e36881zedy2d9vy45ax9kynmb4ajeisjk8inzjj7gd9jjqrne-0rv23q166bt8d7550dtdd7kdt 10.1.1.82:2377
This node joined a swarm as a worker.

查看节点

[xiaoxin@provider1 ~]$ sudo docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
vv85wddm5roxkc2jejjanw2bj     bgt-service         Ready               Active                                  19.03.5
iqoigr0asgkeyocrtz4ovjw2h *   provider1           Ready               Active              Leader              19.03.5

在Swarm中部署服务(这里以nginx服务为例)

Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。

  • 在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式
[xiaoxin@provider1 ~]$ sudo docker network create -d overlay ngx_net
hy4wcoakeb6g5lsl2h8t98d3y
[xiaoxin@provider1 ~]$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1f783cca478d        bridge              bridge              local
1e4dbfa4d07a        docker_gwbridge     bridge              local
b5f4a1f83be7        host                host                local
r1leqmn62roy        ingress             overlay             swarm
hy4wcoakeb6g        ngx_net             overlay             swarm
4915a0c88274        none                null                local

在manager-node节点上使用上面这个覆盖网络创建nginx服务

[xiaoxin@provider1 ~]$ sudo docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx
in8lbvfc0hv386lxj2l284ey5
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

就创建了一个具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx
--replicas:参数指定服务由几个实例组成。
注意:不需要提前在节点上下载nginx镜像,这个命令执行后会自动下载这个容器镜像(比如此处创建tomcat容器,就将下面命令中的镜像改为tomcat镜像)。

  • 查看正在运行服务的列表
[xiaoxin@provider1 ~]$ sudo docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
in8lbvfc0hv3        my-test             replicated          1/1                 nginx:latest        *:80->80/tcp

查询Swarm中服务的信息
--pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息:

[xiaoxin@provider1 ~]$ sudo docker service inspect --pretty my-test
 
ID:     in8lbvfc0hv386lxj2l284ey5
Name:       my-test
Service Mode:   Replicated
 Replicas:  1
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:latest@sha256:b2d89d0a210398b4d1120b3e3a7672c16a4ba09c2c4a0395f18b9f7999b768f2
 Init:      false
Resources:
Networks: ngx_net
Endpoint Mode:  vip
Ports:
 PublishedPort = 80
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress

查询到哪个节点正在运行该服务。
如下该容器被调度到node1节点上启动了

[xiaoxin@provider1 ~]$ sudo docker service ps my-test
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
hibhqr5ebg2p        my-test.1           nginx:latest        provider1           Running             Running 2 minutes ago

注意,如果上面命令执行后,上面的 STATE 字段中刚开始的服务状态为 Preparing,需要等一会才能变为 Running 状态,其中最费时间的应该是下载镜像的过程。
有上面命令可知,该服务在node1节点上运行。登陆该节点,可以查看到nginx容器在运行中

[xiaoxin@provider1 ~]$ sudo docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
52781e5b63a8        nginx:latest          "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        80/tcp                   my-test.1.hibhqr5ebg2pbt6auwg2zg7nf
6dffa3ce9c79        portainer/portainer   "/portainer"             3 hours ago         Up 3 hours          0.0.0.0:9000->9000/tcp   hungry_roentgen

在Swarm中动态扩展服务(scale)
当然,如果只是通过service启动容器,swarm也算不上什么新鲜东西了。Service还提供了复制(类似kubernetes里的副本)功能。可以通过 docker service scale 命令来设置服务中容器的副本数:
比如将上面的my-test容器动态扩展到5个,命令如下:

[xiaoxin@provider1 ~]$ sudo docker service scale my-test=5
my-test scaled to 5
overall progress: 5 out of 5 tasks
1/5: running   [==================================================>]
2/5: running   [==================================================>]
3/5: running   [==================================================>]
4/5: running   [==================================================>]
5/5: running   [==================================================>]
verify: Service converged
[xiaoxin@provider1 ~]$ sudo docker service ps my-test
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
hibhqr5ebg2p        my-test.1           nginx:latest        provider1           Running             Running 4 minutes ago                       
x5ueiy7cae2b        my-test.2           nginx:latest        bgt-service         Running             Running 11 seconds ago                      
g18c9mfo4zd0        my-test.3           nginx:latest        bgt-service         Running             Running 11 seconds ago                      
gbnvu3s2vmgx        my-test.4           nginx:latest        bgt-service         Running             Running 11 seconds ago                      
80u7oqfiknat        my-test.5           nginx:latest        provider1           Running             Running 19 seconds ago                      
[xiaoxin@provider1 ~]$

和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 nginx 服务中的容器

  • 停止task
[xiaoxin@provider1 ~]$ sudo docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
b1a872773446        nginx:latest          "nginx -g 'daemon of…"   45 seconds ago      Up 43 seconds       80/tcp                   my-test.5.80u7oqfiknat311um583lvmvh
52781e5b63a8        nginx:latest          "nginx -g 'daemon of…"   5 minutes ago       Up 4 minutes        80/tcp                   my-test.1.hibhqr5ebg2pbt6auwg2zg7nf
6dffa3ce9c79        portainer/portainer   "/portainer"             3 hours ago         Up 3 hours          0.0.0.0:9000->9000/tcp   hungry_roentgen
[xiaoxin@provider1 ~]$ sudo docker stop b1a872773446 52781e5b63a8
b1a872773446
52781e5b63a8

删除容器服务

[xiaoxin@provider1 ~]$ sudo docker service rm my-test  //这样就会把所有节点上的所有容器(task任务实例)全部删除了
my-test

除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。

[root@manager-node ~]# docker service update --replicas 3 my-test
my-test

docker service update 命令,也可用于直接 升级 镜像等。

[root@manager-node ~]# docker service update --image nginx:new my-test

 

继续阅读
  • 我的QQ
  • QQ扫一扫
  • weinxin
  • 我的头条
  • 头条扫一扫
  • weinxin
IT
  • 本文由 发表于 2020年3月23日18:16:06
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Docker部署Apollo Apollo

Docker部署Apollo

安装docker $ cd /opt/ $ sudo git clone --depth=1 https://github.com/cncentoscn/setuptools.git $ cd set...
Docker安装redis Docker

Docker安装redis

下载镜像 # docker pull redis 创建目录 # mkdir -p /home/redis/data # mkdir -p /home/redis/config 从 Redis 官方下载...
Centos8.1安装docker Docker

Centos8.1安装docker

yum方式安装 安装依赖 # yum install -y yum-utils device-mapper-persistent-data lvm2 添加仓库 # yum-config-manager...