前言
在前面的文章中,已經介紹如何在本地通過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
