上次說了docker machine和常用的命令。docker machine就是在遠(yuǎn)程機(jī)器上安裝docker的,雖然實(shí)際線上環(huán)境很少使用,在實(shí)驗(yàn)環(huán)境中docker machine還是非常重要的。本次開始說三劍客中的最后一個(gè)docker warm。

(一)Docker Swarm介紹
使用SwarmKit構(gòu)建的 Docker 引擎內(nèi)置(原生)的集群管理和編排工具。內(nèi)置在docker之中的,原生的docker集群編排工具,docker swarm非常的重要本身也是編排工具和后面要提到的Mesos,k8s,跟k8s是競爭的關(guān)系,但是k8s發(fā)展到現(xiàn)在已經(jīng)完完全全給其他競爭對手完全的甩開了。這個(gè)系列主要說的k8s,但是docker swarm的使用方法也是一定要提的。
- ①Swarm的架構(gòu)
1.節(jié)點(diǎn)下面有角色:Worker,Manager
2.Manager 是整個(gè)warm集群的大腦,為了避免單點(diǎn)的故障,我們的大腦至少有2個(gè),狀態(tài)的同步通過raft協(xié)議進(jìn)行同步。raft協(xié)議可以確保多個(gè)Manager之前是同步的。
3.管理節(jié)點(diǎn)用于Swarm集群的管理,docker swarm命令基本只能在管理節(jié)點(diǎn)執(zhí)行(節(jié)點(diǎn)退出集群命令docker swarm leave可以在工作節(jié)點(diǎn)執(zhí)行)。
4.Manager節(jié)點(diǎn)的也可以是worker節(jié)點(diǎn)。一個(gè)主機(jī)可以既是Manager也是worker節(jié)點(diǎn)。在實(shí)際的生產(chǎn)中,為了凸顯manager的調(diào)度性能,manager上不跑worker節(jié)點(diǎn)。

- ②Swarm的服務(wù)和任務(wù)
1.任務(wù)是最小的單元,就是一個(gè)節(jié)點(diǎn)運(yùn)行的容器。下圖的node。
2.服務(wù)是指一組任務(wù),整個(gè)生成的3個(gè)nginx被稱為服務(wù)。

- ③如何部署
客戶端的發(fā)起docker命令,兩種方式
- 直接ssh到manager節(jié)點(diǎn),執(zhí)行docker命令。
- 通過遠(yuǎn)程訪問的方式,通過Remote API調(diào)用manager上的docker命令,我們這張圖畫的就是第二種方式。

docker Client 在manager節(jié)點(diǎn)的外邊,假如執(zhí)行了docker service create,先會(huì)經(jīng)過docker Deamon接受這條命令,傳給Scheduler模塊,Scheduler模塊主要實(shí)現(xiàn)調(diào)度的功能,負(fù)責(zé)選擇出來最優(yōu)的節(jié)點(diǎn),里面包含了2個(gè)子模塊,F(xiàn)iter 和Strategy,F(xiàn)iter很明顯是過濾節(jié)點(diǎn),用來找出滿足條件的節(jié)點(diǎn)(資源足夠多,節(jié)點(diǎn)正常的),Strategy是過濾出來后選擇出最優(yōu)的節(jié)點(diǎn)(對比選擇資源剩余最多的節(jié)點(diǎn),或者找到資源剩余最少的節(jié)點(diǎn)),當(dāng)然Fiter 和Strategy都是用戶可以單獨(dú)定制的,中間的Cluster是抽象的worker節(jié)點(diǎn)集群,包含了Swarm節(jié)點(diǎn)里面每個(gè)節(jié)點(diǎn)的信息,右邊的Discovery是信息維護(hù)的模塊,比如Label Health。Cluster最終調(diào)用容器的api,完成容器啟動(dòng)的流程。
(二)集群演示
- ①主機(jī)信息
| 系統(tǒng)類型 | IP地址 | 節(jié)點(diǎn)角色 | CPU | Memory | Hostname |
|---|---|---|---|---|---|
| Centos7 | 192.168.66.100 | Manager | 2 | 2G | Nexus |
| Centos7 | 192.168.66.101 | Nexus | 2 | 2G | Nexus |
| Centos7 | 192.168.66.102 | Nexus | 2 | 2G | Nexus |

- ② manager節(jié)點(diǎn)初始化操作(192.168.66.100)
添加初始化init服務(wù),默認(rèn)是manager節(jié)點(diǎn)
docker swarm init --advertise-addr 192.168.66.100

- ③ 添加worker節(jié)點(diǎn)(192.168.66.101)
上邊manager初始化的時(shí)候,有對應(yīng)的worker命令。
docker swarm join --token SWMTKN-1-3gfv7tpeznhwsl7v3y0n9f5g7547lgzo7fjpv0pm5s6uzvdlgg-b0mlie5vhp2ms1xg1tyd7zwc2 192.168.66.100:2377

- ④ 添加worker節(jié)點(diǎn)(192.168.66.102)
上邊manager初始化的時(shí)候,有對應(yīng)的worker命令。
docker swarm join --token SWMTKN-1-3gfv7tpeznhwsl7v3y0n9f5g7547lgzo7fjpv0pm5s6uzvdlgg-b0mlie5vhp2ms1xg1tyd7zwc2 192.168.66.100:2377

- ⑤ manager查看節(jié)點(diǎn)
docker node ls

- ⑥ 創(chuàng)建service服務(wù)
replicas 3個(gè)節(jié)點(diǎn)
docker service create --replicas 3 -p 80:80 --name nginx nginx
docker service ls
docker service ps





- ⑥ 刪除service服務(wù)
docker service rm nginx

(二)docker swarm 運(yùn)行docker-compose文件
- ①stack
Docker Stack功能包含在Docker引擎中。你不需要安裝額外的包來使用它,docker stacks 只是swarm mode的一部分。它支持相同類型的compose文件,但實(shí)際的處理是發(fā)生在Docker Engine(docker引擎)內(nèi)部的Go代碼中。 在使用堆棧命令之前,還必須創(chuàng)建一個(gè)單機(jī)版的“swarm”,但這并不是什么大問題。
- ②測試docker-compose文件
mkdir labs
cd labs
vi docker-compose.yml

version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:

- ③運(yùn)行 docker-compose.yml
docker stack deploy example --compose-file=docker-compose.yml
docker stack ls
docker stack services example


- 打開網(wǎng)頁
http:/192.168.66.100:5000/
http://192.168.66.100:5001/
http://192.168.66.100:8080/


- 擴(kuò)展vote
docker service scale example_vote=4


- 刪除stack
docker stack rm example

PS:這就是我們的服務(wù)編排,都是在三個(gè)節(jié)點(diǎn),所謂的編排就是將多個(gè)節(jié)點(diǎn)變成一個(gè)節(jié)點(diǎn)來使用,接下來講的k8s要把docker swarm功能要強(qiáng)大很多,當(dāng)然也要復(fù)雜很多。docker的基本命令一樣掌握好!后面說k8s才不會(huì)那么吃力,遇到問題了才知道如何解決。