概述
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