Docker Swarm 從入門到放棄
準備工作
我本機是macOS,所以我直接安裝了docker desktop,其中包含了docker-machine,不用單獨安裝。
安裝docker主機驅動
我在網上很多人提到了使用virtualbox,太重量級了,我安裝了xhyve,更輕量級。
brew install docker-machine-driver-xhyve
下載boot2docker.iso
如果不安裝的話第一次執行docker-machine create 速度會很慢,你懂得哦。所以在github上下載boot2docker.iso, 然後拷貝到對應目錄下,我的主機目錄(/Users/zhangfei/.docker/machine/cache),
建立docker主機
建立docker主機我們用到docker-machine 命令,這也是docker三劍客之一的命令。
檢視主機
docker-machine ls
建立主機
# xhyve驅動
docker-machine create -d xhyve test1
# virtualbox驅動
docker-machine create -d virtualbox test1
進入主機
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建立一個管理節點,初始化叢集的時候會自動把當前節點設定為管理員節點。
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節點,並加入叢集,上面已經給出了提示命令。
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叢集,包含一個管理節點和兩個工作節點。
docker service部署單個叢集服務
我們使用docker service命令來管理swarm叢集中的服務,該命令只能在管理節點上執行, 這裡我們使用nginx作為測試映象,我這裡會拉去nginx最新版本,拉取之前,我們先在3臺docker主機上配置國內映象地址,要不然拉取官方映象的話會很慢。
#在三臺主機上以此執行
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
#服務部署好檢視服務
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服務。
從叢集中移除服務
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 服務
nginx服務
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
總結
在測試視覺化工具時,我先使用visualizer,stack命令執行後Rurrent State一直是Preparing, 也就是說服務一直起不來,不知道什麼情況,猜測可能是映象問題,然後換了另一個portainer時就好了,證明確實是那個映象有問題,這裡感謝純潔的微笑大哥和蟋蟀大哥的文章,學習了docker swarm相關。
參考
https://github.com/machine-drivers/docker-machine-driver-xhyve
https://www.cnblogs.com/guge-94/p/11102076.html
https://blog.csdn.net/Enjolras_fuu/article/details/89244113
https://www.cnblogs.com/xishuai/p/docker-swarm.h