DOCKER 学习笔记8 Docker Swarm 集群搭建

前言

在前面的文章中,已经介绍如何在本地通过Docker Machine 创建虚拟Docker 主机,以及也可以在本地Windows 创建虚拟主机,也是可以使用的。这一节,我们将继续学习 Docker 三剑客之一 : Docker Swarm

Docker Swarm

Docker Swarm 是Docker 的本地聚集类,它将一组Docker 主机转换为一个虚拟单独的 Docker 主机。Docker Swarm 使用标准的Docker API。所以与Docker 守护进程交互的工具都可以使用 Swarm 对多个主机进行转换扩展。 包括有:

  • Docker Componse
  • Docker Machine
  • Dokku

Docker Swarm 支持即插即用原则,随着初始开发的结束,API 开发起来支持可插后端。 这意味着您可以交换调度后端 Docker Swarm 使用的开箱即用与后端您喜欢。 Swarm 的可切换设计为大多数用例提供了一个平滑的开箱体验。

安装 Docker Swarm

我们可以通过官方Docker Swarm 的镜像来创建一个集群,因为Docker Swarm 其实也是一个 Docker images

docker run swarm --help


$ docker run swarm --help
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
d85c18077b82: Pull complete                                                                                             1e6bb16f8cb1: Pull complete                                                                                             85bac13497d7: Pull complete                                                                                             Digest: sha256:b866583a3b8791bcd705b7bc0fd94c66b695a1a2dbaeb5f59ed29940e5015dc8
Status: Downloaded newer image for swarm:latest
Usage: swarm [OPTIONS] COMMAND [arg...]

A Docker-native clustering system

Version: 1.2.9 (527a849)

Options:
  --debug                       debug mode [$DEBUG]
  --log-level, -l "info"        Log level (options: debug, info, warn, error, fatal, panic)
  --experimental                enable experimental features
  --help, -h                    show help
  --version, -v                 print the version

Commands:
  create, c     Create a cluster
  list, l       List nodes in a cluster
  manage, m     Manage a docker cluster
  join, j       Join a docker cluster
  help          Shows a list of commands or help for one command

Run 'swarm COMMAND --help' for more information on a command.

因为是第一次使用镜像,所以Docker Engine 会检查当前环境是否有这个镜像,没有则拉取了最新的版本到本地。

使用Docker Swarm 镜像的好处

相比于其他方法,使用Swarm 镜像的好处在于

  • 不需要额外再系统上安装任何二进制执行文件来使用 Swarm
  • 可以通过docker engine 获取到最新版本
  • 容器与Swarm 环境隔离。不需要单独维护

创建具有交互式容器的集群

集群,需要创建一个管理节点和工作节点。这里测试创建一个管理节点,在管理节点加入两个工作节点,这就组成一集群。

创建管理节点

docker-machine ls 查看现有虚拟主机


$ docker-machine.exe ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.5

发现已经有一个虚拟主机在运行,其实可以将这个主机作为管理主机

通过 SSH 连接管理节点,在第一个虚拟机 创建管理节点

docker-machine ssh default 连接虚拟主机,开启Swarm


docker@default:~$ docker swarm init --advertise-addr 192.168.99.102
Swarm initialized: current node (5mohlisxbrkogfbtzk6nujkfw) is now a manager.

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

    docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377

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

docker swarm init --advertise-addr 192.168.99.102

这里需要指定一个地址,因为虚拟机,通过ip address 可发现这个虚拟机有多个网卡,所以,我们需要指定一个地址。

创建主节点后,可以获取到一个 Token 这个token 呢 就是我们需要创建 服务节点所需要用到的。

docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377

执行 docker info 后我们可以发现,当前Swarm 已经是活动的状态,管理节点 1


 Swarm: active
  NodeID: rzu7l3z4mysplwgdce8vj2364
  Is Manager: true
  ClusterID: uuq50bc4x4bckqfglkrj05vao
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8

docker node ls 可以查看当前节点信息


docker@default:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw *   default             Ready               Active              Leader              19.03.5

创建工作节点

docker-machine create work1 创建一个默认的VirtualBox VM 的虚拟主机。

docker-machine ssh work1 连接虚拟主机后,将本节点加入管理节点

docker@work1:~$ docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377
This node joined a swarm as a worker.

同样的,再创建一个work2 节点,加入到default 当中。

管理节点信息

当前主机上,我们可以查看到所有的虚拟主机情况。

$ docker-machine.exe ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.5
work1     -        virtualbox   Running   tcp://192.168.99.103:2376           v19.03.5
work2     -        virtualbox   Running   tcp://192.168.99.104:2376           v19.03.5

进入管理主机,查看节点的情况。

docker@default:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw *   default             Ready               Active              Leader              19.03.5
qqgd4abpjw08lwh31ddgez041     work1               Ready               Active                                  19.03.5
gblxw2whlxl0k94nmfozhs7gl     work2               Ready               Active                                  19.03.5

服务和任务关系

  • 服务是一组任务的集合,一个服务可以有多个任务。
  • 任务是集群里面最小的一个单位,比如ping www.baidu.com

部署集群服务

docker-machine ssh default 连接管理主机


docker@default:~$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
c9b1b535fdd9: Pull complete                                                                                                                                                              Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

拉取一个 alpine linux 镜像

Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗

部署任务

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

docker service create --replicas 1  --name hello-world alpine ping www.baidu.com
  • --replicas 指定任务的数量
  • --name 指定服务的名称
  • alpine 需要运行的镜像名称
  • ping www.baidu.com 镜像里面需要运行的命令

docker@default:~$ docker service create --replicas 1  --name hello-world alpine ping www.baidu.com
nzr66u3j32ndgzodw08cer1he
overall progress: 1 out of 1 tasks                                                                                                                                                       1/1: running[==================================================>]                                                                                                                     verify: Service converged   
        

常用命令

docker service ps <name> 查看服务的运行状态、以及进展

docker@default:~$ docker service ps hello-world
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
j03uhnoauhet        hello-world.1       alpine:latest       default             Running             Running 8 minutes ago

docker service ls 查看当前Swarm 集群所运行的所有任务

docker@default:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
nzr66u3j32nd        hello-world         replicated          1/1                 alpine:latest

监控服务

docker service inspect --pretty hello-world 命令可以概览服务的运行情况。


ID:             nzr66u3j32ndgzodw08cer1he
Name:           hello-world
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:         alpine:latest@sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
 Args:          ping www.baidu.com
 Init:          false
Resources:
Endpoint Mode:  vip

弹性伸缩

docker service update --replicas 2 hello-world 将原来的服务任务数量改为2次

docker@default:~$ docker service update --replicas 2 hello-world
hello-world
overall progress: 2 out of 2 tasks                                                                                                                                                       1/2: running   [==================================================>]                                                                                                                     2/2: running   [==================================================>]                                                                                                                     verify: Service converged     

docker service ps <name> 查看本次任务的运行情况

docker@default:~$ docker service ps hello-world
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
j03uhnoauhet        hello-world.1       alpine:latest       default             Running             Running 26 minutes ago
k6oudbv4e9he        hello-world.2       alpine:latest       work1               Running             Running about a minute ago

这里将这两个任务分配到 default work1 节点

查看 work1 节点运行情况

### 进入work1
docker-machine ssh work1

docker@work1:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
1c86154f43f4        alpine:latest       "ping www.baidu.com"   4 minutes ago       Up 4 minutes                            hello-world.2.k6oudbv4e9henfqbhvulxt1y2

从集群退出

docker swarm leave 执行退出命令后,该节点已下线。

docker@default:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw *   default             Ready               Active              Leader              19.03.5
qqgd4abpjw08lwh31ddgez041     work1               Down                Active                                  19.03.5
gblxw2whlxl0k94nmfozhs7gl     work2               Ready               Active                                  19.03.5

参考

https://www.cnblogs.com/ityouknow/p/8903975.html

原文地址:https://www.cnblogs.com/ChromeT/p/12306725.html