1. 程式人生 > >DOCKER 學習筆記8 Docker Swarm 叢集搭建

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.h