走進docker-swarm 帶你們快速掌握docker自帶編排工具

什麼是Docker Swarm?

  • 對比Docker

前面咱們介紹過Docker能夠理解成是一個咱們的服務的獨立運行的容器,那麼在實際工做中,咱們的系統多是一個微服務應用,系統中根據業務拆分紅多個模塊,能夠理解一個模塊對應一組運行着相同鏡像的的Docker容器,這就是單個Docker,而Swarm就是這個系統中,可以管理全部的容器之間的路由、負載均衡、服務發現,以及容器的伸縮(能夠理解爲咱們一個服務進行擴/縮容)、日誌、配置文件的編排工具。node

  • 對比Docker-Compose

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

  • 對比Kubernetes

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

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

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 ... : 啓動服務🈯️定--mode global 則不能使用此命令,global建立一個服務會在每一個節點都啓動一個
# frontend服務擴容50個節點
$ docker service scale frontend=50

frontend scaled to 50
  • 指定參數更新 具體參考 https://docs.docker.com/engine/reference/commandline/service_update/

Swarm實戰演練

使用Dcoker-Machine建立3臺虛擬機redis

1.建立三臺主機docker

docker-machine create --driver=virtualbox  manager
docker-machine create --driver=virtualbox  node-1
docker-machine create --driver=virtualbox  node-2

[root@docker ~]# docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER      ERRORS
manager   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.12   
node-1    -        virtualbox   Running   tcp://192.168.99.103:2376           v19.03.12   
node-2    -        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.12  

2.建立好主機後初始化Swarm manager節點shell

[root@docker ~]# docker-machine ssh manager
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

# --advertise-addr 改爲 manager 節點ip
docker@manager:~$   docker swarm init --advertise-addr 192.168.99.100  
Swarm initialized: current node (alz0od3rbkg552mkicfuezhkn) is now a manager.

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

    docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

這樣就初始化好了manager是否是很簡單?後端

3.切換node-一、node-2加入集羣架構


# node-1加入swarm集羣、
[root@docker ~]# docker-machine ssh node-1
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

docker@node-1:~$ docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
This node joined a swarm as a worker.


#node-2加入swarm集羣
[root@docker ~]# docker-machine ssh node-2
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

docker@node-2:~$     docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
This node joined a swarm as a worker

  1. 在manager查看當前集羣node狀態
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
  1. 建立一個nginx服務包含3個副本
# --replicas 指定容器個例數
docker@manager:~$ docker service create  --name test-nginx --publish 8080:80  --replicas=3 nginx
ya3q60llnj62w141aaekggyl2
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
docker@manager:~$ docker service ls                                                                                                                                                       
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ya3q60llnj62        test-nginx          replicated          3/3                 nginx:latest        *:8080->80/tcp

這時候建立好了3個nginx服務,這時候咱們只要訪問manager的ip:8080 則能夠隨機訪問任意一個nginx服務,是否是相似nginx的負載均衡?負載均衡

# 發送屢次請求nginx服務
curl 192.168.99.100:8080
#查看日誌
docker@manager:~$ docker service logs -f ya3q60llnj62                                                                                                                                     
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.1.h50ridnlpsim@node-2    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.1.h50ridnlpsim@node-2    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.1.h50ridnlpsim@node-2    | 10.0.0.2 - - [25/Mar/2021:14:59:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.1.h50ridnlpsim@node-2    | 10.0.0.2 - - [25/Mar/2021:14:59:33 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.3.mw75ab00bfs1@node-1    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.3.mw75ab00bfs1@node-1    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:28 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:34 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.2.drsv2s4cnf9y@manager    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.2.drsv2s4cnf9y@manager    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.2.drsv2s4cnf9y@manager    | 10.0.0.2 - - [25/Mar/2021:14:59:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.2.drsv2s4cnf9y@manager    | 10.0.0.2 - - [25/Mar/2021:14:59:32 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

至此全部請求負載到後端3個nginx服務上。

結束

下篇結合微服務說swarm如何能夠代替微服務的功能!

歡迎關注公衆號! 公衆號回覆:入羣 ,掃碼加入咱們交流羣! 掃碼關注公衆號獲取更多學習資料

相關文章
相關標籤/搜索