Docker深入淺出系列 | Swarm多節點實戰

  • 2020 年 3 月 16 日
  • 筆記

Docker已經上市很多年,不是什麼新鮮事物了,很多企業或者開發同學以前也不多不少有所接觸,但是有實操經驗的人不多,本系列教程主要偏重實戰,盡量講乾貨,會根據本人理解去做闡述,具體官方概念可以查閱官方教程,因為本系列教程對前一章節有一定依賴,建議先學習前面章節內容。

本系列教程導航:
Docker深入淺出系列 | 容器初體驗
Docker深入淺出系列 | Image實戰演練
Docker深入淺出系列 | 單節點多容器網絡通信
Docker深入淺出系列 | 容器數據持久化
Docker深入淺出系列 | 單機Nginx+Springboot實戰
Docker深入淺出系列 | Docker Compose多容器實戰

教程目的:

  • 了解docker swarm是什麼&為什麼要用
  • 了解docker swarm網絡模型
  • 了解在swarm模型的核心實現機制
  • 了解如何通過docker compose 文件定義和管理服務
  • 了解如何利用docker compose 文件去創建服務
  • 了解docker stack的基本命令
  • 了解docker service的基本命令
  • 掌握docker swarm在實戰應用

前期準備

1.下載mysql

docker pull mysql

2.下載nginx

docker pull nginx

3.克隆credit-facility-service作為後面部署演示使用,使用docker分支

git clone https://github.com/EvanLeung08/credit-facility-service.git

4.虛擬機、centos和docker環境安裝請查看第一章,本章默認已經安裝好centos和docker
Docker深入淺出系列 | 容器初體驗


Swarm基本概念

什麼是Docker Swarm


簡單來說,Docker Swarm就是一個把多個物理主機或者虛擬機組成的集群上的容器群進行管理的容器編排工具,負責編排、調度和集群管理,由集群的活動由集群管理器控制,加入集群的機器稱為節點,允許用戶管理跨多個主機部署的多個容器。

SwarmKit是可擴展分佈式系統的節點發現、基於Raft的共識、任務調度、基於基元的編排工具包,該工具包使用Raft共識算法來協調和決策分佈式系統。

以下列出了Docker Swarm的一些關鍵術語:

  • 節點(Node): 在編排方面,節點是主機。 一個節點可以是單個主機中的多個VM。

  • 管理節點(Manager Node): 此節點負責維護Swarm編排,它管理集群環境。

  • 工作節點(Worker Node): 該節點負責執行管理節點定義的任務。 它將始終將其狀態通知給Manager節點並提供分配給它的服務。

  • 服務(Service): 這些是在Manager或Worker節點上執行的任務,可以理解成一堆相同的運行任務組成一個服務。
  • 任務(Task): 任務包含一個Docker容器和在容器內運行的命令,它是swarm的原子調度單元,如果某一個任務奔潰,那麼協調器將創建一個新的副本任務,該任務將生成一個新的容器

     ![](https://img-blog.csdnimg.cn/20200316212916538.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0V2YW5fTGV1bmc=,size_16,color_FFFFFF,t_70)

為什麼要用Swarm

Docker Swarm和k8s都是目前的容器編排的主流技術,但是目前市場上大多數企業都是用k8s進行容器集群管理,k8s的背靠Google這棵大樹,開源社區也非常活躍,隨着這些年雲廠商的迅速發展,k8s是未來趨勢,我個人建議在真實項目還是使用k8s進行容器編排和管理,不過這裡是docker專場,我暫不多說,會在後面k8s專題去講這一塊內容。

假如沒有Swarm這類多機容器管理技術,我們很難對容器進行管理,並且容器之間沒辦法實現跨機器通信。而Docker swarm可以讓用戶輕鬆在多個機器上發佈和管理應用,並且我們不需要關注每個容器實例具體落在哪一個節點,swarm把我們的應用以服務的形式暴露出去,並內置服務發現和負載均衡,讓運行在多個節點上的容器集群感覺就像只有一個應用在跑一樣簡單,可以輕鬆實現擴容和自動容錯(一個swarm任務的容器奔潰會自動擴展一個新的容器)。Swarm集群通常有幾個工作程序節點和至少一個管理程序節點,負責高效地處理工作程序節點的資源並確保集群有效地運行,提高了應用可用性。


***

Swarm的網絡模型


以下三個網絡概念對於Swarm集群服務很重要:

  • OverlayOverlay網絡管理參與集群的Docker守護程序之間的通信。您可以使用與獨立容器的用戶定義網絡相同的方式創建Overlay網絡。您也可以將服務附加到一個或多個現有的Overlay網絡,以啟用服務到服務的通信。Overlay網絡是使用Overlay網絡驅動程序的Docker網絡。

  • ingressingress網絡是一種特殊的Overlay網絡,可促進服務節點之間的負載均衡。當任何集群節點在已發佈的端口上收到請求時,會將請求轉交給名為IPVS的模塊。 IPVS通過ingress網絡跟蹤參與該服務的所有IP地址,選擇其中一個並將請求發送給它。
    當對節點進行swarm initswarm join時,會自動創建ingress網絡。大多數用戶不需要自定義其配置,但是Docker 17.05及更高版本允許您自定義。

  • docker_gwbridgedocker_gwbridge是一個橋接網絡,它將overlay網絡(包括ingress網絡)連接到單個Docker守護程序的物理網絡。默認情況下,服務正在運行的每個容器都連接到其本地Docker守護程序主機的docker_gwbridge網絡。

初始化或加入集群時會自動創建docker_gwbridge網絡。大多數用戶不需要自定義其配置,但是Docker允許您自定義。

Swarm的核心實現機制

服務發現機制

Docker Engine內有一個嵌入式DNS服務器,當Docker不以Swarm模式運行時,容器會使用這個服務器;而當Docker Engine以Swarm模式運行時,該服務器將用於任務。 它為bridgeOverlayMACVLAN網絡中主機上的所有容器提供名稱解析。 每個容器將其查詢請求轉發到Docker引擎,後者依次檢查該容器或服務是否與首先發送請求的容器在同一網絡上。 如果是,它將在其內部鍵值存儲中搜索與容器、任務或服務的名稱匹配的IP(或虛擬IP)地址,並將其返回給發送請求的容器。

如果匹配的資源與生成請求的容器在同一網絡內,則Docker引擎只會返回IP地址。 這樣做的好處還在於,Docker主機僅存儲屬於該節點在其中具有容器或任務的網絡的DNS條目。 這意味着它們將不會存儲實際上與他們無關的信息,或者其他容器不需要知道的信息。

在上圖中,有一個名為custom-net的自定義網絡。 網絡上運行着兩種服務:myservice和myclient。 myservice有兩個與之關聯的任務,而客戶端只有一個。

客戶端myclient然後執行對myservice的curl請求,因此,它也在對DNS進行請求。 容器內置的解析器將查詢轉發到Docker引擎的DNS服務器。 然後,對myservice的請求將解析為10.0.0.2虛擬IP,轉發回客戶端,客戶端就可以通過虛擬ip去訪問容器。

負載均衡機制Routing Mesh

Docker內部請求負載均衡

創建服務後,Docker將自動啟用此功能。 因此,創建服務後,它會立即在服務的網絡上獲得虛擬IP地址。 就像上文在服務發現部分中所說的那樣,當請求服務時,所得到的DNS查詢將轉發到Docker引擎,該引擎進而返回服務的IP,即虛擬IP。 發送到該虛擬IP的流量將負載均衡到網絡上該服務的所有正常運行的容器。 所有負載均衡均由Docker完成,因為只有一個入口點被分配給客戶端(一個IP)。

Docker外部請求負載均衡(Ingress)

默認情況下,不會激活負載均衡,當在創建或更新時使用–publish標誌公開服務時,集群中的每個節點都會開始偵聽已發佈的端口,這意味着每個節點都可以響應對映射到該端口的服務的請求。

當某個節點接收到一個請求,但該節點沒有容器實例時,會發生什麼? 從Docker 1.12(將Swarm模式集成到Docker Engine的同一版本)開始,就有一個名為Routing Mesh的功能,該功能使用IP虛擬服務器(ipvs)和iptables來負載均衡第4層中的請求。基本上,ipvs實現了第4層 Linux內核上的負載均衡功能,該功能允許將對基於TCP / UDP的服務的請求重定向到實際的後端(在這種情況下為容器)。 在Swarm的特定情況下,每個節點都偵聽暴露的端口,然後使用稱為ingress的特殊Overlay網絡將請求轉發到暴露的服務的VIP(虛擬IP)。 僅當將外部流量傳輸到請求的服務時,才使用此Overlay網絡。 在這種情況,docker會使用與上文描述的相同的內部負載均衡策略。


在上圖中,在appnet Overlay網絡上創建了具有兩個副本的服務。 我們可以看到該服務在三個節點上的8000端口上公開,此時,發往應用程序的流量可以轉發到任何節點。 假設在這種情況下,有一個外部負載均衡器,它恰好將請求轉發到唯一沒有該服務實例的節點, 該請求由IPVS在第三個節點上處理和轉發,該IPVS使用ingress網絡並因此使用上述負載均衡方法將其重定向到該服務的集群上的其中一個真實運行的容器。

Swarm模式運行機制


上圖來自官方,很清晰展示了在swarm模式,manage節點和worker節點是怎麼協作的,這裡就不做細說了。


項目實戰

實戰目標

  • 創建自定義overlay網絡credit-facility-net
  • 搭建Swarm集群
    • manager-node – 192.168.101.11
    • worker01-node – 192.168.101.12
    • worker03-node – 192.168.101.13
  • 搭建額度服務集群,三個應用實例
    • [額度服務]credit-facility-net:8080
  • 搭建Mysql數據庫
    • [Mysql服務]db:3306
  • 搭建Nginx服務,並配置負載均衡規則
    • [Nginx服務]nginx:80
  • 創建Volume credit-facility-volume,用於持久化Mysql容器數據
  • 利用docker swarm負載均衡和服務發現的特點,docker網絡內容器之間通過容器名稱進行通信
  • 通過瀏覽器訪問swagger進行業務操作

因為我機器資源不夠,我這裡只是創建了三台虛擬機,manager節點也是可以部署服務的

搭建虛擬機節點

搭建虛擬機節點

這裡用到Vagrant來管理虛擬機,如果不知道Vagrant是什麼,請查看第一章內容。Vagrant指令可以查看Vagrant詳細指令文檔

1.在我們的主機(你自己的電腦)創建一個文件夾swarm-centos7,然後在目錄下創建一個Vagrantfile文件

Vagrant

boxes = [      {          :name => "manager-node",          :eth1 => "192.168.101.11",          :mem => "1024",          :cpu => "1"      },      {          :name => "worker01-node",          :eth1 => "192.168.101.12",          :mem => "1024",          :cpu => "1"      },      {          :name => "worker02-node",          :eth1 => "192.168.101.13",          :mem => "1024",          :cpu => "1"      }  ]    Vagrant.configure(2) do |config|      config.vm.box = "centos7"       boxes.each do |opts|        config.vm.define opts[:name] do |config|          config.vm.hostname = opts[:name]          config.vm.provider "vmware_fusion" do |v|            v.vmx["memsize"] = opts[:mem]            v.vmx["numvcpus"] = opts[:cpu]          end            config.vm.provider "virtualbox" do |v|            v.customize ["modifyvm", :id, "--memory", opts[:mem]]            v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]            v.customize ["modifyvm", :id, "--name", opts[:name]]          end            config.vm.network :public_network, ip: opts[:eth1]        end    end    end

這裡指定了三台虛擬機的配置,並且分別分配了一個靜態ip 192.168.101.11192.168.101.12192.168.101.13,並且循環創建虛擬機。這裡指定了docker swarm最低要求配置1個CPU、1G內存。

2.啟動三台虛擬機,記得在啟動過程選擇你可用的網卡

evans-MacBook-Pro:swarm-centos7 evan$ vagrant up

當該命令執行完畢,會有三台虛擬機成功被初始化

初始化虛擬機密碼

因為後面需要用到ssh客戶端工具,所以這裡要把密碼開放下

修改 manager 節點訪問密碼,用於後面上傳文件使用,這裡的密碼是evan123

[root@manager-node local]# passwd  Changing password for user root.  New password:  BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic  Retype new password:  passwd: all authentication tokens updated successfully.

這裡只演示了manager節點,另外兩個worker節點也需要做同樣的操作

安裝Docker環境

需要在每個節點安裝Docker,請使用SSH客戶端工具,分別登陸3個虛擬機,先按以下步驟安裝docker

1.卸載之前的docker配置,如有

    sudo yum remove docker                     docker-client                     docker-client-latest                     docker-common                     docker-latest                     docker-latest-logrotate                     docker-logrotate                     docker-engine

2.安裝服務器必要的依賴

    sudo yum install -y yum-utils       device-mapper-persistent-data       lvm2

3.配置加速器,因為國內下載docker需要越過長城,會比較慢,這裡我用到的是我自己的阿里雲加速器,如果不知道怎麼配置的,請查看第一章

sudo mkdir -p /etc/docker  sudo tee /etc/docker/daemon.json <<-'EOF'  {    "registry-mirrors": ["https://6xh8u88j.mirror.aliyuncs.com"]  }  EOF  sudo systemctl daemon-reload  sudo systemctl restart docker

4.設置Docker倉庫

sudo yum-config-manager         --add-repo         https://download.docker.com/linux/centos/docker-ce.repo

5.安裝Docker

sudo yum install -y docker-ce docker-ce-cli containerd.io

6.安裝完畢後,分別進入manger節點和2個worker節點,啟動docker服務

[root@manager-node ~]# systemctl start docker

7.驗證docker,輸入docker info,驗證下docker是否已經安裝成功


搭建swarm集群

初始化manager節點

這裡需要先進入manager節點192.168.101.11進行swarm初始化操作,

[root@manager-node credit-facility]# docker swarm init --advertise-addr=192.168.101.11  Swarm initialized: current node (tdtu8tl63zqim8jrbzf8l5bcn) is now a manager.    To add a worker to this swarm, run the following command:        docker swarm join --token SWMTKN-1-61e18f81408f4ja2yrcn9l11y5x21okcx58d3f6gcptyydb0iz-9hquv710qpx8s4h88oy2fycei 192.168.101.11:2377    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

這裡會生成一串token,隨後需要在worker節點使用該命令去加入到swarm集群中

worker節點加入swarm集群

這裡我們需要分別進去兩個worker節點192.168.101.12192.168.101.13執行以下操作

docker swarm join --token SWMTKN-1-61e18f81408f4ja2yrcn9l11y5x21okcx58d3f6gcptyydb0iz-9hquv710qpx8s4h88oy2fycei 192.168.101.11:2377

這裡表示當前節點加入swarm集群

查看當前節點

只能在swarm manager節點查看當前所有節點信息

[root@manager-node credit-facility]# docker node ls  ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION  tdtu8tl63zqim8jrbzf8l5bcn *   manager-node        Ready               Active              Leader              19.03.7  n8m358c7ta18206gzey7xsvw8     worker01-node       Ready               Active                                  19.03.7  pgzph6ye6xl1p9fz0hif191kn     worker02-node       Ready               Active                                  19.03.7

這裡可以看到,我們的3個節點都已經成功加入到swarm集群,manager-node是我們的swarm集群 leader


搭建項目

創建工作目錄

跟前一章一樣,在集群三個節點的/usr/local下,分別建一個credit-facitliy目錄

[root@worker01-node local]# mkdir credit-facility

打包上傳jar

  • 為了讓後面我們更方便動態修改數據庫配置,額度服務的數據庫配置改為動態變量,如下:
# for docker-stack demo  spring.datasource.url = jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}?useUnicode=true&characterEncoding=utf8  #spring.datasource.url = jdbc:mysql://192.168.101.23:3301/db_credit_facility?useUnicode=true&characterEncoding=utf8  #配置數據庫用戶名  #spring.datasource.username = root  spring.datasource.username = ${DB_USER}  #配置數據庫密碼  #spring.datasource.password = evan123  spring.datasource.password = ${DB_PASSWORD}

配置文件我已經在項目里提前修改好了,大家直接用即可

  • 接下來繼續用maven對項目打包mvn clean package,打包後在star目錄下
  • 分別上傳項目jar包到manager、worker01、worker02節點
evans-MacBook-Pro:target evan$ sftp [email protected]  [email protected]'s password:  Connected to [email protected].  sftp> put start-1.0.0-SNAPSHOT.jar /usr/local/credit-facility  Uploading start-1.0.0-SNAPSHOT.jar to /usr/local/credit-facility/start-1.0.0-SNAPSHOT.jar  start-1.0.0-SNAPSHOT.jar                            100%   43MB  76.5MB/s   00:00  sftp> 
evans-MacBook-Pro:target evan$ sftp [email protected]  [email protected]'s password:  Connected to [email protected].  sftp> put start-1.0.0-SNAPSHOT.jar /usr/local/credit-facility  Uploading start-1.0.0-SNAPSHOT.jar to /usr/local/credit-facility/start-1.0.0-SNAPSHOT.jar  start-1.0.0-SNAPSHOT.jar                            100%   43MB  76.5MB/s   00:00  sftp> 
evans-MacBook-Pro:target evan$ sftp [email protected]  [email protected]'s password:  Connected to [email protected].  sftp> put start-1.0.0-SNAPSHOT.jar /usr/local/credit-facility  Uploading start-1.0.0-SNAPSHOT.jar to /usr/local/credit-facility/start-1.0.0-SNAPSHOT.jar  start-1.0.0-SNAPSHOT.jar                            100%   43MB  76.5MB/s   00:00  sftp> 

創建額度服務Image

  • 分別在三個節點/usr/local/credit-facility目錄下,創建Dockerfile
[root@manager-node credit-facility]# cat Dockerfile  FROM openjdk:8-jre-alpine  MAINTAINER evan  LABEL name="credit-facility" version="1.0" author="evan"  COPY start-1.0.0-SNAPSHOT.jar credit-facility-service.jar  CMD ["java","-jar","credit-facility-service.jar"]

該文件我已經提前放置在額度服務項目里,直接copy即可

  • 分別在三個節點的/usr/local/credit-facility目錄下,執行以下命令創建額度服務鏡像,這裡只演示manager節點,其他節點操作一樣
[root@manager-node credit-facility]# docker build -t credit-facility-image .  Sending build context to Docker daemon  44.92MB  Step 1/5 : FROM openjdk:8-jre-alpine   ---> f7a292bbb70c  Step 2/5 : MAINTAINER evan   ---> Running in 50b0ae0125ef  Removing intermediate container 50b0ae0125ef   ---> b4231d681d22  Step 3/5 : LABEL name="credit-facility" version="1.0" author="evan"   ---> Running in 4a6bb0ae9f12  Removing intermediate container 4a6bb0ae9f12   ---> ea441d121fc4  Step 4/5 : COPY start-1.0.0-SNAPSHOT.jar credit-facility-service.jar   ---> 0bed9d9397f6  Step 5/5 : CMD ["java","-jar","credit-facility-service.jar"]   ---> Running in 6bb0c14f1a85  Removing intermediate container 6bb0c14f1a85   ---> de2606eea641  Successfully built de2606eea641  Successfully tagged credit-facility-image:latest

創建完查看下每個節點現有的鏡像列表:

[root@worker01-node credit-facility]# docker images  REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE  credit-facility-image   latest              8dcef5954aaa        3 hours ago         130MB  openjdk                 8-jre-alpine        f7a292bbb70c        10 months ago       84.9MB

從上面查詢結果可以看到,我們的額度服務鏡像已經成功創建

創建Nginx配置

因為我們後面用到Nginx服務,所以我們需要提前把配置創建後,然後通過--mount方式把配置文件覆蓋Nginx容器內的默認配置

/usr/local/credit-facility文件夾下,創建一個nginx目錄,並在nginx目錄下建一個nginx.conf配置文件

[root@manager-node nginx]# cat nginx.conf  user nginx;  worker_processes  1;  events {      worker_connections  1024;  }  http {      include       /etc/nginx/mime.types;      default_type  application/octet-stream;      sendfile        on;      keepalive_timeout  65;          server {          listen 80;          location / {           proxy_pass http://balance;          }      }        upstream balance{        server credit-facility-service:8080;      }      include /etc/nginx/conf.d/*.conf;  }

我這裡利用docker swam內置DNS原理,我這裡配置域名是額度服務名稱credit-facility-servicedocker swarm會自動幫我們路由到對應的服務節點上

創建Compose配置文件

  • 在manager節點的/usr/local/credit-facility文件夾下,創建一個docker-stack.yml用於創建和管理服務(注意,這裡只需要manager節點創建即可,manager節點會把docker service發佈到到其他節點)
[root@manager-node credit-facility]# cat docker-stack.yml  version: '3'  services:    db:      restart: always      image: mysql      build:        context: /usr/local/credit-facility      ports:        - 3306:3306/tcp      volumes:        - "credit-facility-volume:/var/lib/mysql:rw"      environment:        - MYSQL_DATABASE=db_credit_facility        - MYSQL_ROOT_PASSWORD=evan123      networks:        - demo-overlay      deploy:        mode: global        placement:          constraints:            - node.role == manager      credit-facility-service:      restart: always      image: credit-facility-image      build:        context: /usr/local/credit-facility      ports:        - 8080:8080      environment:        - DB_HOST=db        - DB_PORT=3306        - DB_USER=root        - DB_PASSWORD=evan123        - DB_NAME=db_credit_facility      networks:        - demo-overlay      deploy:        mode: replicated        replicas: 3        restart_policy:          condition: on-failure          delay: 5s          max_attempts: 3        update_config:          parallelism: 1          delay: 10s      nginx:      restart: always      depends_on:        - db        - credit-facility-service      image: nginx      ports:        - "80:80"      volumes:        - /usr/local/credit-facility/nginx/nginx.conf:/etc/nginx/nginx.conf      networks:        - demo-overlay      deploy:        mode: global        placement:          constraints:            - node.role == manager    networks:     demo-overlay:      driver: overlay    volumes:    credit-facility-volume: {}

發佈服務到Docker Swarm

  • 使用docker stack去發佈服務,可以將服務發佈到集群各個節點上(docker compose是用於單機部署,多機部署需要用到docker swarm stack)
[root@manager-node credit-facility]# docker stack deploy -c docker-stack.yml web  Ignoring unsupported options: build, restart    Ignoring deprecated options:    container_name: Setting the container name is not supported.    Creating network web_credit-facility-net  Creating service web_nginx  Creating service web_db  Creating service web_credit-facility-service  ...
  • 查看服務狀態
[root@manager-node nginx]# docker service ls  ID                  NAME                          MODE                REPLICAS            IMAGE                          PORTS  3qcjnj7n5dkk        web_credit-facility-service   replicated          3/3                 credit-facility-image:latest   *:8080->8080/tcp  t5omqvum57ag        web_db                        global              1/1                 mysql:latest                   *:3306->3306/tcp  w89fkne6fzcg        web_nginx                     global              1/1                 nginx:latest                   *:80->80/tcp

從上面結果可以看到,我們發佈的各個服務已經成功啟動,額度服務的3個實例也成功發佈到3個節點中

  • 查看下額度服務每個服務實例落在哪個節點
[root@manager-node nginx]# docker service ps web_credit-facility-service  ID                  NAME                            IMAGE                          NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS  pc32kfmfxke0        web_credit-facility-service.1   credit-facility-image:latest   worker01-node       Running             Running 23 minutes ago  8v9efe61p5wb        web_credit-facility-service.2   credit-facility-image:latest   manager-node        Running             Running 23 minutes ago  sg1wh95lxyca        web_credit-facility-service.3   credit-facility-image:latest   worker02-node       Running             Running 23 minutes ago 

上面結果可以清晰看到,每一個實例被發佈到哪個節點中

初始化數據庫配置

跟前面章節一樣,因為額度服務對數據庫有依賴,所以這裡需要初始化額度服務用到的表,使用Mysql客戶端,連接到數據庫,把項目里resources/db的表創建語句放入執行,我這裡用Navicat去連接,數據庫連接是192.168.101.11:3306

驗證目錄文件

到這裡,所有的配置已經完成了,我們來一起核對下現有的文件有哪些,看看大家有沒有遺漏的惡配置

在manager節點的credit-facility文件夾下,應該有以下文件

[root@manager-node credit-facility]# ls  docker-compose.yaml  Dockerfile  docker-stack.yml  nginx  start-1.0.0-SNAPSHOT.jar

在2個worker節點的credit-facility文件夾下,應該有以下文件

worker-01節點

[root@worker01-node credit-facility]# ls  Dockerfile  start-1.0.0-SNAPSHOT.jar

worker-02節點

[root@worker02-node credit-facility]# ls  Dockerfile  start-1.0.0-SNAPSHOT.jar

驗證服務

  • 驗證Nginx服務 – 假如Nginx代理規則沒問題,應該輸入192.168.101.11http://192.168.101.11/swagger-ui.html可以訪問到我們的額度服務

    從上面可以看到,我們的Nginx已經起作用,成功代理我們的額度服務集群
  • 驗證額度服務每個節點 – 假如docker swarm正常運行,那麼我們應該可以分別通過三個節點的ip+8080訪問我們的服務



    從上面顯示結果可以看到,我通過三個節點的ip和8080端口都成功訪問到我們的額度服務,證明我們的swarm集群已經搭建成功

驗證額度服務功能

因為我們額度服務有用到數據庫,這裡我們實驗下調用額度服務的接口,看是否可以成功入庫

請求參數如下:

{      "registrationLimitCO": {          "applicationId": "1111",          "userId": 1111,          "quotaLimit": 10000,          "productCode": "tb",          "expirationTime": "2030-01-01",          "accountType": 1      }    }

執行額度註冊接口

執行結果:

從上面執行結果可以看到,我們的接口已經成功處理我們的請求,並且入庫成功,有興趣的同學可以到數據庫去查看相應記錄


附錄

參考引用

官方文檔 – Swarm Networking

Docker Swarm常用指令

Docker Stack

  • 查看stack具體信息
[root@manager-node credit-facility]# docker stack ls  NAME                SERVICES            ORCHESTRATOR  web                 3                   Swarm
  • 根據docker-stack.yml創建服務
docker statck deploy -c docker-stack.yml web
  • 查看某個service
[root@manager-node credit-facility]# docker service inspect web_db  ...          "Endpoint": {              "Spec": {                  "Mode": "vip",                  "Ports": [                      {                          "Protocol": "tcp",                          "TargetPort": 3306,                          "PublishedPort": 3306,                          "PublishMode": "ingress"                      }                  ]              },              "Ports": [                  {                      "Protocol": "tcp",                      "TargetPort": 3306,                      "PublishedPort": 3306,                      "PublishMode": "ingress"                  }              ],              "VirtualIPs": [                  {                      "NetworkID": "5mmql4cfhoac6q3y67wm4x2uh",                      "Addr": "10.0.0.122/24"                  },                  {                      "NetworkID": "xx3b6lki8n1nvkphffretc050",                      "Addr": "10.0.6.12/24"                  }              ]          }          ...

Docker Service

  • 創建一個nginx的service
docker service create --name my-nginx nginx
  • 查看當前swarm的service
docker service ls
  • 查看service的啟動日誌
docker service logs my-nginx
  • 查看service的詳情
ocker service inspect my-nginx
  • 查看my-nginx運行在哪個node上
docker service ps my-nginx
  • 水平擴展service
docker service scale my-nginx=3  docker service ls  docker service ps my-nginx
  • 刪除service
docker service rm my-nginx