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.克隆credit-facility-service
作為后面部署演示使用,使用docker
分支
git clone https://github.com/EvanLeung08/credit-facility-service.git
2.虛擬機、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的原子調度單元,如果某一個任務奔潰,那么協調器將創建一個新的副本任務,該任務將生成一個新的容器
為什么要用Swarm
Docker Swarm和k8s都是目前的容器編排的主流技術,但是目前市場上大多數企業都是用k8s進行容器集群管理,k8s背靠Google這棵大樹,開源社區也非常活躍,隨着這些年雲廠商的迅速發展,k8s是未來趨勢,我個人建議在真實項目還是使用k8s進行容器編排和管理,不過這里是docker專場,我暫不多說,會在后面k8s專題去講這一塊內容。
假如沒有Swarm這類多機容器管理技術,我們很難對容器進行管理,並且容器之間難以實現跨機器通信。而Docker swarm可以讓用戶輕松在多個機器上發布和管理應用,並且我們不需要關注每個容器實例具體落在哪一個節點,swarm把我們的應用以服務的形式暴露出去,並內置服務發現和負載均衡,讓運行在多個節點上的容器集群感覺就像只有一個應用在跑一樣簡單,可以輕松實現擴容和自動容錯(一個swarm任務的容器奔潰會自動擴展一個新的容器
)。Swarm集群通常有幾個工作程序節點和至少一個管理程序節點,負責高效地處理工作程序節點的資源並確保集群有效地運行,提高了應用可用性。
Swarm的網絡模型
以下三個網絡概念對於Swarm集群服務很重要:
-
Overlay -
Overlay
網絡管理參與集群的Docker守護程序之間的通信。您可以使用與獨立容器的用戶定義網絡相同的方式創建Overlay
網絡。您也可以將服務附加到一個或多個現有的Overlay
網絡,以啟用服務到服務的通信。Overlay
網絡是使用Overlay
網絡驅動程序的Docker網絡。 -
ingress -
ingress
網絡是一種特殊的Overlay
網絡,可促進服務節點之間的負載均衡。當任何集群節點在已發布的端口上收到請求時,會將請求轉交給名為IPVS的模塊。 IPVS通過ingress
網絡跟蹤參與該服務的所有IP地址,選擇其中一個並將請求發送給它。
當對節點進行swarm init
或swarm join
操作時,會自動創建ingress
網絡。大多數用戶不需要自定義其配置,但是Docker 17.05及更高版本允許您自定義。 -
docker_gwbridge -
docker_gwbridge
是一個橋接網絡,它將overlay
網絡(包括ingress
網絡)連接到單個Docker守護程序的物理網絡。默認情況下,服務正在運行的每個容器都連接到其本地Docker守護程序主機的docker_gwbridge
網絡。
初始化或加入集群時會自動創建docker_gwbridge
網絡,大多數用戶不需要自定義其配置,但是Docker允許您自定義。
Swarm的核心實現機制
服務發現機制
Docker Engine內有一個嵌入式DNS服務器,當Docker不以Swarm模式運行時,容器會使用這個服務器;而當Docker Engine以Swarm模式運行時,該服務器將用於任務(task)。 它為bridge
,Overlay
或MACVLAN
網絡中主機上的所有容器提供名稱解析。 每個容器將其查詢請求轉發到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)
默認情況下,Docker不會激活負載均衡,只有當在創建或更新時使用–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.11
、192.168.101.12
和192.168.101.13
,並且循環創建3台虛擬機。這里指定了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.12
和 192.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 root@192.168.101.11
root@192.168.101.11's password:
Connected to root@192.168.101.11.
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 root@192.168.101.12
root@192.168.101.11's password:
Connected to root@192.168.101.12.
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 root@192.168.101.13
root@192.168.101.11's password:
Connected to root@192.168.101.13.
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-service
,docker 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
}
}
執行額度注冊接口
執行結果:
從上面執行結果可以看到,我們的接口已經成功處理我們的請求,並且入庫成功,有興趣的同學可以到數據庫去查看相應記錄
附錄
參考引用
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
有興趣的朋友,歡迎加我公眾號一起交流,有問題可以留言,平時工作比較忙,我也抽時間盡量回復每位朋友的留言,謝謝!