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