docker swarm(一) 入門 -- 搭建一個簡單的swarm集群

概述

Docker Swarm是容器的集群管理工具。它的主要特性:

  • 集成于Docker Engine的集群管理工具。
  • 分布式設計。從一個image生成整個集群。一個docker swarm下的不同node,可以分布于同一,或不同的物理設備上。
  • 靈活調度。按需啟動或關閉容器。
  • 高可用性。支持監(jiān)控容器狀態(tài),如果容器崩潰,可以自動重啟容器。
  • 支持多樣的網(wǎng)絡配置。支持overlay、macvlan、bridge、host等網(wǎng)絡形式。
  • 服務發(fā)現(xiàn)。
  • 負載均衡。
  • 加密傳輸。默認基于TLS實現(xiàn)容器間的交互,實現(xiàn)加密傳輸。
  • 升級回退。支持動態(tài)升級容器,如果升級后的容器運行不正常,可自動回退到上一版本。

主要概念

node(節(jié)點)

每個docker node都是docker engine的實例(可以理解成,每個docker node即是安裝了docker環(huán)境的PC),可分為manager和worker兩類。

  • manager node:
    • 給worker nodes分配任務(task)。
    • 識別worker nodes的狀態(tài),調度容器。
  • worker node
    • 執(zhí)行manager mode分配的任務(task)。

service(服務)與task(任務)

Docker Swarm通過一個YAML格式的文件,定義了生產環(huán)境(in production)中的Docker container行為。此文件包含對services定義、運行、擴容。

service可以理解為是"containers in production"。它是一個swarm系統(tǒng)中最關鍵的定義。
一個service只能運行一個image,但是可以運行出同一個image的多個containers。

一個task是swarm調度的最小單位,它運行于manager或worker nodes上。它即對應service中的一個container實例。它包含:

  • 一個container
  • container啟動后運行的指令

搭建一個Docker Swarm

環(huán)境準備

準備兩個虛擬機,一個作為manager,一個作為worker。兩個虛擬機間能ping通。并且要求以下端口開放訪問:2377,2946。

創(chuàng)建Swarm

在manager設備上,創(chuàng)建swarm,同時配置一下manager的ip。

$ docker swarm init --advertise-addr 192.168.154.135
Swarm initialized: current node (78ayx9kk6n3qr4gcn05nmuvzg) is now a manager.

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

    docker swarm join --token SWMTKN-1-523lnlcl8xbol5hmg4aab6ur2g2flmdx5zxb31qzj8r8ty0mbo-bhfp0yf7er2vysftf753s3rz5 192.168.154.135:2377

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

通過docker info確認一下swarm已經創(chuàng)建。

$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 5
  Running: 0
  Paused: 0
  Stopped: 5
...
 Swarm: active
  NodeID: 78ayx9kk6n3qr4gcn05nmuvzg
  Is Manager: true
  ClusterID: ommhsz8xug6ltvauyusfn3vsp
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
...

通過docker node ls確認docker node信息。

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
78ayx9kk6n3qr4gcn05nmuvzg *   ubuntu              Ready               Active              Leader              19.03.5

把worker nodes加入swarm

在上一步創(chuàng)建swarm時,docker提示了加入此swarm應執(zhí)行的命令。在worker node上執(zhí)行這些命令。

$  docker swarm join --token SWMTKN-1-523lnlcl8xbol5hmg4aab6ur2g2flmdx5zxb31qzj8r8ty0mbo-bhfp0yf7er2vysftf753s3rz5 192.168.154.135:2377
This node joined a swarm as a worker.

如果你沒有記錄下這個加入swarm的命令,可以在manager node上執(zhí)行docker swarm join-token worker以重新獲取命令。

再回到manager節(jié)點上,查看當前swarm的成員。

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
78ayx9kk6n3qr4gcn05nmuvzg *   ubuntu              Ready               Active              Leader              19.03.5
lugs1vyy3o6z3dvnpytkxf6yi     ubuntu              Ready               Active                                  19.03.5

創(chuàng)建并部署一個service

在manager節(jié)點上,創(chuàng)建一個service。

docker service create --replicas 1 --name helloworld alpine ping docker.com

參數(shù)解釋:

  • --replicas:service運行的實例個數(shù)
  • --name: 命名service為helloword
  • alpine ping docker.com: 定義此service為,在
    Alpine Linux容器中,執(zhí)行ping docker.com

docker service ls確認一下:

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
uyxa5ye0061k        helloworld          replicated          1/1                 alpine:latest

在執(zhí)行了docker service create之后,此service即是已經被拆解成task執(zhí)行了。通過以下命令可以查看它的執(zhí)行狀態(tài)。這里不具體展開了。

docker service inspect --pretty <SERVICE-ID>
docker service ps <SERVICE-ID>

docker ps可以查看在當前node上執(zhí)行的task。此service當前在manager node上執(zhí)行。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a1f880ea0a72        alpine:latest       "ping docker.com"   16 minutes ago      Up 15 minutes                           helloworld.1.crxx3hwti4wmj5p6zyqe8yi03

service縮容與擴容

docker service scale可以修改一個serivce衍生出的副本數(shù)量,也就是task數(shù)量。通過以下命令將helloworld擴容到5個task。

$ docker service scale helloworld=5
helloworld 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 

查看service在各nodes上的運行情況

$ docker service ps helloworld
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
crxx3hwti4wm        helloworld.1        alpine:latest       ubuntu              Running             Running 55 minutes ago                           
1kej5h5qmkvt        helloworld.2        alpine:latest       ubuntu-2            Running             Running about a minute ago                       
u7i09cvrv7sj        helloworld.3        alpine:latest       ubuntu-2            Running             Running about a minute ago                       
glipqhq70jo7         \_ helloworld.3    alpine:latest       ubuntu-2            Shutdown            Shutdown 8 minutes ago                           
x9qkewnqf2fa        helloworld.4        alpine:latest       ubuntu              Running             Running about a minute ago                       
vwkke0hvmxk8         \_ helloworld.4    alpine:latest       ubuntu-2            Shutdown            Shutdown 8 minutes ago                           
dsyijxuant14        helloworld.5        alpine:latest       ubuntu-2            Running             Running about a minute ago                       
ku0o7qg243tl         \_ helloworld.5    alpine:latest       ubuntu-2            Shutdown            Shutdown 8 minutes ago

刪除service

執(zhí)行docker service rm刪除service。

$ docker service rm helloworld
helloworld

若干秒后,此service衍生出的task也都停止運行。

$ docker service ps helloworld
no such service: helloworld
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容