1. 程式人生 > >走進docker-swarm 帶大家快速掌握docker自帶編排工具

走進docker-swarm 帶大家快速掌握docker自帶編排工具

什麼是Docker Swarm?

  • 對比Docker

前面我們介紹過Docker可以理解成是一個我們的服務的獨立執行的容器,那麼在實際工作中,我們的系統可能是一個微服務應用,系統中根據業務拆分成多個模組,可以理解一個模組對應一組執行著相同映象的的Docker容器,這就是單個Docker,而Swarm就是這個系統中,能夠管理所有的容器之間的路由、負載均衡、服務發現,以及容器的伸縮(可以理解為我們一個服務進行擴/縮容)、日誌、配置檔案的編排工具。

  • 對比Docker-Compose

Docker-Compose類似與我們生活中的管家,它僅僅能夠管理一個主機上的所有容器,他可以一次性啟動多個容器。而Docker-Swarm可以跨主機去管理多個容器,並且當一個容器狀態異常時候可以快速在其他機器上啟動容器,保證服務的高可用!

  • 對比Kubernetes

Kubernetes它本身的角色定位是和Docker Swarm 是一樣的,也就是說他們負責的工作在容器領域來說是相同的部分,都是一個跨主機的容器管理平臺,當然也有自己一些不一樣的特點,k8s是谷歌公司根據自身的多年的運維經驗研發的一款容器管理平臺。而Docker Swarm則是由Docker 公司研發的。Kubernetes在Docker基礎上封裝了一層概念,所以他的功能相對於Swarm更強大,但是運維更復雜,Swarm則更容易上手。

綜上所述大家應該知道Docker就是一個容器,Docker-Compose是一個單主機的編排工具,Docker-Swarm是一個多主機的編排工具!

swarm
  • Swarm架構組成
    • Docker Api 是基於Docker去管理容器
    • Swarm Manage CLi 是Swarm叢集管理Api
    • Leadership 這個是Swarm提供的HA
    • Scheduler 則是Swarm的排程策略,以及過濾規則管理
    • Discovery Service 管理每個容器的服務的註冊、發現
結構圖
  • Swarm如何工作? Swarm節點分為管理節點(manager)跟 工作節點(worker),管理節點主要用於swarm叢集的管理(也可以設定執行任務工作),Docker Swarm命令只能在管理節點上去操作,一個叢集可以存在多個管理節點,但是隻有一個管理節點可以成為Leader。工作節點是任務執行節點。
    • Manager節點:
      1. 處理叢集管理任務
      2. 維護叢集狀態
      3. 排程服務
      4. Swarm 提供外部可呼叫的 API 介面
    • Worker節點: 實際執行我們服務的Docker容器
執行圖

Docker Swarm命令

  • 初始化叢集
$ docker swarm init --advertise-addr 192.168.99.121
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • 加入叢集
# 加入worker 
$ docker swarm join-token worker


To add a worker to this swarm, run the following command:
    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377
# 加入manager 
$ docker swarm join-token manager

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

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 \
    172.17.0.2:2377
  • 離開叢集
# --force / -f 強制離開
$ docker swarm leave -f
Node left the default swarm.
  • 檢視叢集節點資訊
docker@manager:~$ docker node ls                                                                                                                                                          
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
alz0od3rbkg552mkicfuezhkn *   manager             Ready               Active              Leader              19.03.12
jxf5u2hnurrgz90vnd9ay3y7p     node-1              Ready               Active                                  19.03.12
lldvm2slseyodo0t7ath5tzne     node-2              Ready               Active                                  19.03.12

  • swarm叢集中建立服務
docker service create --name redis redis:3.0.6

dmu1ept4cxcfe8k8lhtux3ro3

$ docker service create --mode global --name redis2 redis:3.0.6

a8q9dasaafudfs8q8w32udass

$ docker service ls

ID            NAME    MODE        REPLICAS  IMAGE
dmu1ept4cxcf  redis   replicated  1/1       redis:3.0.6
a8q9dasaafud  redis2  global      1/1       redis:3.0.6
  • 檢視swarm叢集服務資訊
$ docker service inspect redis
  • 檢視服務的日誌
$ docker service logs -f redis

  • 檢視啟動所有服務
$ docker service ls 
ID            NAME      MODE            REPLICAS             IMAGE
c8wgl7q4ndfd  frontend  replicated      5/5                  nginx:alpine
dmu1ept4cxcf  redis     replicated      3/3                  redis:3.0.6
iwe3278osahj  mongo     global          7/7                  mongo:3.3
hh08h9uu8uwr  job       replicated-job  1/1 (3/5 completed)  nginx:latest

  • 檢視服務啟動的具體容器
$ docker service ps redis

ID             NAME      IMAGE        NODE      DESIRED STATE  CURRENT STATE          ERROR  PORTS
0qihejybwf1x   redis.1   redis:3.0.5  manager1  Running        Running 8 seconds
bk658fpbex0d   redis.2   redis:3.0.5  worker2   Running        Running 9 seconds
5ls5s5fldaqg   redis.3   redis:3.0.5  worker1   Running        Running 9 seconds
  • 刪除服務
$ docker service rm redis

redis

$ docker service ls

ID  NAME  MODE  REPLICAS  IMAGE
  • 擴容/縮容服務(可以動態新增服務提供節點,在swarm節點叢集中啟動) docker service create --mode global ... : 啟動服務