Docker Swarm 從入門到放棄

image.png

準備工做

我本機是macOS,因此我直接安裝了docker desktop,其中包含了docker-machine,不用單獨安裝。html

image.png
安裝docker主機驅動

我在網上不少人提到了使用virtualbox,過重量級了,我安裝了xhyve,更輕量級。node

brew install docker-machine-driver-xhyve
複製代碼

下載boot2docker.iso

若是不安裝的話第一次執行docker-machine create 速度會很慢,你懂得哦。因此在github上下載boot2docker.iso, 而後拷貝到對應目錄下,個人主機目錄(/Users/zhangfei/.docker/machine/cache),nginx

建立docker主機

建立docker主機咱們用到docker-machine 命令,這也是docker三劍客之一的命令。git

查看主機

docker-machine ls
複製代碼

建立主機

# xhyve驅動
docker-machine create -d xhyve test1
# virtualbox驅動
docker-machine create -d virtualbox test1
複製代碼

image.png

進入主機

docker-machine ssh test1
複製代碼

退出主機

docker@test1:exit
複製代碼

建立swarm集羣

建立三臺docker主機

docker-machine create -d xhyve manager1 &&
docker-machine create -d xhyve worker-1 &&
docker-machine create -d xhyve worker-2 
複製代碼

配置集羣節點

執行如下命令,這裏是在manager1主機上使用docker swarm建立一個管理節點,初始化集羣的時候會自動把當前節點設置爲管理員節點。github

bogon:~ zhangfei$ docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.64.2"
Swarm initialized: current node (5lyi9tkwqyugnk9626f5jhamy) is now a manager.

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

    docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377

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

複製代碼

接着在worer1和worker2節點上建立worker節點,並加入集羣,上面已經給出了提示命令。docker

bogon:~ zhangfei$ docker-machine ssh worker1 "docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377"
This node joined a swarm as a worker.
bogon:~ zhangfei$ docker-machine ssh worker2 "docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377"
This node joined a swarm as a worker.
bogon:~ zhangfei$ 
複製代碼

查看集羣節點信息

docker@manager1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
5lyi9tkwqyugnk9626f5jhamy *   manager1            Ready               Active              Leader              19.03.5
r01xh6k73cj24yqrmtau3bsqf     worker1             Ready               Active                                  19.03.5
5hkzm4ogghgbt6bale2bo7lf5     worker2             Ready               Active                                  19.03.5
docker@manager1:~$   
複製代碼

OK,到這裏咱們就建立一個最小的Swarm集羣,包含一個管理節點和兩個工做節點。json

docker service部署單個集羣服務

咱們使用docker service命令來管理swarm集羣中的服務,該命令只能在管理節點上執行, 這裏咱們使用nginx做爲測試鏡像,我這裏會拉去nginx最新版本,拉取以前,咱們先在3臺docker主機上配置國內鏡像地址,要否則拉取官方鏡像的話會很慢。bash

#在三臺主機上以此執行
docker@manager1:~$ sudo touch /etc/docker/daemon.json &&
> sudo chmod 777 /etc/docker/daemon.json &&
> sudo echo '{ "registry-mirrors": ["http://hub-mirror.c.163.com"]}' > /etc/docker/daemon.json
複製代碼
#修改完鏡像地址後重啓三臺docker主機
docker-machine restart manager1 &&
docker-machine restart worker1 &&
docker-machine restart worker2 
複製代碼

#docker service 拉取nginx鏡像
docker@manager1:~$ docker service create --replicas 3 -p 8088:80 --name nginx nginx:latest
複製代碼

#也可使用scale命令手動擴展服務個數
docker@manager1:~$ docker service scale 3
複製代碼

服務部署好查看服務app

#服務部署好查看服務
docker@manager1:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ja2xjj0dn08m        nginx               replicated          3/3                 nginx:latest        *:8088->80/tcp
複製代碼
docker@manager1:~$ docker service ps nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
py9f7w78a95c        nginx.1             nginx:latest        manager1            Running             Running 12 minutes ago                       
ghv07io2w1hv        nginx.2             nginx:latest        worker1             Running             Running 12 minutes ago                       
y00d8c0xadil        nginx.3             nginx:latest        worker2             Running             Running 12 minutes ago
複製代碼

三個服務部署好之後,可使用三臺機器任一ip查看nginx服務。asp.net

image.png

從集羣中移除服務

docker@manager1:~$ docker service rm nginx
複製代碼

docker stack部署多個集羣服務

docker service只能部署單個服務,部署多個服務的話則須要用到docker stack, 這裏一樣要使用到docker-compose.yml配置文件,docker-compose是在單機環境提供多容器編排工具,結合docker stack則實現了多主機容器編排服務。 先來建立docker-compose.yml文件,建立兩個服務,一個是asp.net core的測試鏡像,另外一個是nginx,這裏須要在管理節點建立yml文件。

version: "3"

services:
 aspnetcore:
 image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
 ports:
 - 8088:80
 deploy:
 mode: replicated
 replicas: 3

 nginx:
 image: nginx:latest
 ports:
 - 8087:80
 deploy:
 mode: replicated
 replicas: 3 
複製代碼

如上所述,總共部署了兩個服務,而後執行docker stack deploy命令。

docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-test
Creating network deploy-test_default
Creating service deploy-test_aspnetcore
Creating service deploy-test_nginx
複製代碼

查看服務

docker@manager1:~$ docker service ls
ID                  NAME                     MODE                REPLICAS            IMAGE                                             PORTS
8au30q7tblq0        deploy-test_aspnetcore   replicated          3/3                 mcr.microsoft.com/dotnet/core/samples:aspnetapp   *:8088->80/tcp
367gpz567iiv        deploy-test_nginx        replicated          3/3                 nginx:latest                                      *:8087->80/tcp
複製代碼

查看到服務名稱,而後能夠根據服務名稱查看服務運行情況

docker@manager1:~$ docker service ps deploy-test_nginx
ID                  NAME                  IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
ov75hjkdux6i        deploy-test_nginx.1   nginx:latest        worker1             Running             Running 27 seconds ago                       
bcq2zw5p33cb        deploy-test_nginx.2   nginx:latest        worker2             Running             Running 27 seconds ago                       
cfhbisbab3op        deploy-test_nginx.3   nginx:latest        manager1            Running             Running 27 seconds ago 
複製代碼

到這一步,咱們能夠打開三臺主機的任意一臺,看下8088端口和8087端口的服務。 asp.net core 服務

image.png
nginx服務

image.png
GUI管理頁面

固然,若是說要用於生產環境中,又或者是像經過更直觀的方式觀察容器或者服務的運行狀況,咱們確定離不開可視化界面,這裏推薦兩個可視化工具**visualizer,portainer,  **我更新本地的docker-compose.yml,把portainer更新進去,portainer相比visualizer,功能更強大些,可支持在管理界面上操做服務。          可視化工具只須要安裝在管理節點上便可。

version: "3"

services:
 aspnetcore:
   image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
   ports:
     - 8088:80
   deploy:
     mode: replicated
     replicas: 3

 nginx:
    image: nginx:latest
    ports:
      - 8087:80
    deploy:
      mode: replicated
      replicas: 3

 portainer:
    image: portainer/portainer:latest
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]  
複製代碼
#先暫停stack
docker@manager1:~$ docker stack down deploy-test
Removing service deploy-test_aspnetcore
Removing service deploy-test_nginx
Removing network deploy-test_default
複製代碼
#啓動stack
docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-test
複製代碼

WX20200205-223240@2x.png

WX20200205-223314@2x.png

總結

在測試可視化工具時,我先使用visualizer,stack命令執行後Rurrent State一直是Preparing, 也就是說服務一直起不來,不知道什麼狀況,猜想多是鏡像問題,而後換了另外一個portainer時就行了,證實確實是那個鏡像有問題,這裏感謝純潔的微笑大哥和蟋蟀大哥的文章,學習了docker swarm相關。

參考

github.com/machine-dri… www.cnblogs.com/guge-94/p/1… blog.csdn.net/Enjolras_fu… www.cnblogs.com/xishuai/p/d…

相關文章
相關標籤/搜索