Docker之路-容器編排SWARM


swarm mode 介紹

Docker Swarm 是 Docker 官方容器編排項目之一,提供 Docker 容器集群服務,是 Docker 官方對容器雲生態進行支持的核心方案。

使用它,用戶可以將多個 Docker 主機封裝為單個大型的虛擬 Docker 主機,快速打造一套容器雲平台。

Docker 1.12.0之后的版本中,已經將swarm內嵌入docker引擎了,變成了docker的子命令docker swarm

swarm mode內置了KV存儲功能, 提供了眾多的新特性,具有容錯能力的去中心化設計,內置服務發現、負載均衡、路由網絡、動態伸縮、滾動更新、安全傳輸等。

swarm的基本概念

Swarm 是使用 SwarmKit 構建的 Docker 引擎內置(原生)的集群管理和編排工具。

使用 Swarm 集群之前需要了解以下幾個概念。

節點

運行 Docker 的主機可以主動初始化一個 Swarm 集群或者加入一個已存在的 Swarm 集群,這樣這個運行 Docker 的主機就成為一個 Swarm 集群的節點 (node) 。

節點分為管理 (manager) 節點和工作 (worker) 節點。

管理節點用於 Swarm 集群的管理,docker swarm 命令基本只能在管理節點執行(節點退出集群命令 docker swarm leave 可以在工作節點執行)。一個 Swarm 集群可以有多個管理節點,但只有一個管理節點可以成為 leaderleader 通過 raft 協議實現。

工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點默認也作為工作節點。你也可以通過配置讓服務只運行在管理節點。

來自 Docker 官網的這張圖片形象的展示了集群中管理節點與工作節點的關系。

img

服務和task

任務 (Task)是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。

服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:

  • replicated services 按照一定規則在各個工作節點上運行指定個數的任務。
  • global services 每個工作節點上運行一個任務

兩種模式通過 docker service create--mode 參數指定。

來自 Docker 官網的這張圖片形象的展示了容器、任務、服務的關系。

img

創建swarm集群

通過前面的簡單介紹,我們知道swarm是由管理節點和工作節點組成的,即leader和follower組成,我們選選取一台主機作為swarm的管理節點,在管理節點上執行命令將自己初始化為管理節點(前提是,該主機必須安裝了docker環境),等待其他節點的加入:

[root@node1 ~]# docker swarm init
Swarm initialized: current node (z450zeu3ul9pcggml756lip0w) is now a manager.

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

    docker swarm join --token SWMTKN-1-4kuadn332c96u11gojm6575400eh0m2gmsf7r4nkirdy9op0ka-6kblnv1n1thj8hyozo3fax1ri 10.100.1.123:2377

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

從init之后,給出了如何加入的方法。直接在其他節點上執行即可將主機添加到swarm集群中:

[root@node2 ~]# docker swarm join --token SWMTKN-1-4kuadn332c96u11gojm6575400eh0m2gmsf7r4nkirdy9op0ka-6kblnv1n1thj8hyozo3fax1ri 10.100.1.123:2377
This node joined a swarm as a worker.

可以在管理節點查看整個集群的節點信息:

[root@node1 ~]# docker node ls
ID                            HOSTNAME      STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
tuiqjpehjq9sthd77npydr8qv     node2   		Ready               Active                                  19.03.2
z450zeu3ul9pcggml756lip0w *   node1   		Ready               Active              Leader              19.03.2

在swarm上部署服務

我們使用 docker service 命令來管理 Swarm 集群中的服務,該命令只能在管理節點運行。我們使用 docker service 命令來管理 Swarm 集群中的服務,該命令只能在管理節點運行。

我們在swarm上創建一個nginx服務:

[root@node1 ~]# docker service create --replicas 2 -p 8080:80 --name webnginx nginx
01zq6lp7oyxdgbvw7l34n6j9u
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged

使用 docker service ls 來查看當前 Swarm 集群運行的服務。

[root@node1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
01zq6lp7oyxd        webnginx            replicated          2/2                 nginx:latest        *:8080->80/tcp

我們分別在管理節點和從節點訪問下8080端口,然后可以看看日志:

[root@node1 ~]# docker service logs webnginx
webnginx.1.rf2e15kitl28@node1    | 10.255.0.3 - - [17/Oct/2019:05:27:19 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0" "-"
webnginx.2.35miixmebucu@node2    | 10.255.0.2 - - [17/Oct/2019:05:26:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0" "-"

swars進行服務伸縮

我們可以使用 docker service scale 對一個服務運行的容器數量進行伸縮。

當業務處於高峰期時,我們需要擴展服務運行的容器數量。

[root@node1 ~]# docker service scale webnginx=5
webnginx 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
[root@node1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
01zq6lp7oyxd        webnginx            replicated          5/5                 nginx:latest        *:8080->80/tcp

從上面可以看到副本數量變成了5個。

當業務平穩時,我們需要減少服務運行的容器數量。

[root@node1 ~]# docker service scale webnginx=1
webnginx scaled to 1
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
[root@node1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
01zq6lp7oyxd        webnginx            replicated          1/1                 nginx:latest        *:8080->80/tcp

刪除swarm啟動的服務,發現容器也銷毀了:

[root@node1 ~]# docker service rm webnginx
webnginx
[root@node1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
[root@node1 ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

總結

# 集群管理
docker swarm init
docker swarm join --token <token> 

# 節點管理
docker node [options]

# 服務管理
docker service create ...
docker service ls
docker service logs ...
docker service rm ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM