docker-compose可以解決單機(jī)部署問(wèn)題活鹰,如果是多臺(tái)服務(wù)器集群部署就有點(diǎn)吃力,我們可以用docker內(nèi)置的swarm模式,很方便的實(shí)現(xiàn)集群部署闽寡。
準(zhǔn)備
- 兩臺(tái)CentOS7虛擬機(jī)代兵,為了后續(xù)方便查看,將兩臺(tái)主機(jī)名分別改為manager-node爷狈,worker-node
修改主機(jī)名命令sudo hostnamectl set-hostname manager-node
192.168.30.206 --- manager-node
192.168.30.207 --- worker-node植影,與192.168.30.206 一樣需要配置insecure-registries
并且登錄到docker倉(cāng)庫(kù)docker login 192.168.30.205:5000
- swarm主機(jī)間通信需要開(kāi)放以下端口
-TCP port 2377為集群管理通信
-TCP and UDP port 7946 為節(jié)點(diǎn)間通信
-UDP port 4789 為網(wǎng)絡(luò)間流量
方便起見(jiàn),直接關(guān)閉兩臺(tái)主機(jī)的防火墻
systemctl stop firewalld.service
停止firewall
systemctl disable firewalld.service
禁止firewall開(kāi)機(jī)啟動(dòng)
使用swarm
- 創(chuàng)建一個(gè)swarm集群
docker swarm init --advertise-addr 192.168.30.206
--advertise-addr
指定IP涎永,其他節(jié)點(diǎn)通過(guò)這個(gè)IP找到管理節(jié)點(diǎn)
[root@manager-node ~]# docker swarm init --advertise-addr 192.168.30.206
Swarm initialized: current node (oo3d8s7zd6rn2ojtmj5uac4tu) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2h03tw4nxrfuliz5kvfcvmt9c2jbaguzl4toz2zlpqarp526rc-d4bt9zgztip2ki6exm3ahkg7w 192.168.30.206:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
這樣就已經(jīng)創(chuàng)建好了一個(gè)swarm集群思币,并且自動(dòng)將當(dāng)前主機(jī)加入集群,成為manager節(jié)點(diǎn)羡微,大部分操作都必須在manager節(jié)點(diǎn)上執(zhí)行
- 加入集群
我們?cè)?code>192.168.30.207上執(zhí)行
docker swarm join --token SWMTKN-1-2h03tw4nxrfuliz5kvfcvmt9c2jbaguzl4toz2zlpqarp526rc-d4bt9zgztip2ki6exm3ahkg7w 192.168.30.206:2377
就可以加入該集群谷饿,并且成為一個(gè)工作節(jié)點(diǎn)
[root@worker-node ~]# docker swarm join --token SWMTKN-1-2h03tw4nxrfuliz5kvfcvmt9c2jbaguzl4toz2zlpqarp526rc-d4bt9zgztip2ki6exm3ahkg7w 192.168.30.206:2377
This node joined a swarm as a worker.
如果忘了命令,可以在管理節(jié)點(diǎn)執(zhí)行docker swarm join-token worker
同樣會(huì)顯示這條命令
- 查看節(jié)點(diǎn)妈倔,在管理節(jié)點(diǎn)執(zhí)行
docker node ls
可以查看所有節(jié)點(diǎn)
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
oo3d8s7zd6rn2ojtmj5uac4tu * manager-node Ready Active Leader 18.09.0
yjwitrd8qelt8jkdqfho6aesv worker-node Ready Active 18.09.0
Leader
就表明了哪個(gè)節(jié)點(diǎn)是管理節(jié)點(diǎn)
創(chuàng)建網(wǎng)絡(luò)
為了在集群中實(shí)現(xiàn)跨主機(jī)通信博投,我們需要?jiǎng)?chuàng)建一個(gè)overlay網(wǎng)絡(luò),與創(chuàng)建bridge網(wǎng)絡(luò)類似
docker network create \
-d overlay my_overlay_network \
--subnet 10.10.0.0/24 \
--gateway 10.10.0.1
-d
指定網(wǎng)絡(luò)模式為overlay
--subnet
可以指定網(wǎng)段
-gateway
指定網(wǎng)關(guān)
修改application.yml文件
主要是加入spring.cloud.inetutils.preferred-network
和 prefer-ip-address
discovery/application.yml
spring:
application:
name: discovery
#指定網(wǎng)段
cloud:
inetutils:
preferred-networks: 10.10.0
server:
port: 8761
eureka:
client:
fetch-registry: false
register-with-eureka: false
serviceUrl:
defaultZone: http://discovery:8761/eureka/
instance:
#修改微服務(wù)顯示名
instance-id: ${spring.application.name}:${server.port}
#集群下需要通過(guò)IP進(jìn)行通信
prefer-ip-address: true
其他兩個(gè)類似修改盯蝴,改完后每個(gè)都需要重新 mvn clean deploy
創(chuàng)建Service
docker service create \
--replicas 2 \
--name service_discovery \
--network my_overlay_network \
--with-registry-auth \
-p 8761:8761 \
192.168.30.205:5000/discovery:0.0.1-SNAPSHOT
--replicas 1
指定創(chuàng)建的服務(wù)實(shí)例個(gè)數(shù)
--name
指定服務(wù)名
--network
指定網(wǎng)絡(luò)
--with-registry-auth
使用已登錄的認(rèn)證信息毅哗,不配置會(huì)報(bào)no such image
-p
指定端口
執(zhí)行過(guò)程
0srlbhbgwwduksnf5ovtlvqrf
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
成功后執(zhí)行docker service ps service_discovery
可以看到兩個(gè)節(jié)點(diǎn)都被分派到了任務(wù)
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
yrqwvyvfcyuq service_discovery.1 192.168.30.206:5000/discovery:0.0.1-SNAPSHOT manager-node Running Running about a minute ago
auoooqa4bxft service_discovery.2 192.168.30.206:5000/discovery:0.0.1-SNAPSHOT worker-node Running Running about a minute ago
訪問(wèn) http://192.168.30.206:8761/ ,http://192.168.30.207:8761/ 任意一臺(tái)都可以打開(kāi)注冊(cè)中心捧挺,證明已經(jīng)完成集群部署虑绵,其他兩個(gè)微服務(wù)也是類似操作
Stack部署
Stack就是Service的集合
類似docker-compose.yml
我們也可以編寫(xiě)stack.yml
統(tǒng)一創(chuàng)建服務(wù)
新建stack.yml
version: '3'
services:
discovery:
image: 192.168.30.205:5000/discovery:0.0.1-SNAPSHOT
ports:
- "8761:8761"
deploy:
replicas: 1
networks:
- my_overlay_network
provider-user:
image: 192.168.30.205:5000/provider-user:0.0.1-SNAPSHOT
ports:
- "8762:8762"
deploy:
replicas: 2
networks:
- my_overlay_network
provider-order:
image: 192.168.30.205:5000/provider-order:0.0.1-SNAPSHOT
ports:
- "8763:8763"
deploy:
replicas: 2
networks:
- my_overlay_network
networks:
my_overlay_network:
external: true
部署stack
dokcer stack deploy -c stack.yml --with-registry-auth my_stack my_stack
-c
指定stack.yml文件
--with-registry-auth
使用已有的認(rèn)證信息
執(zhí)行后可以看到,成功創(chuàng)建了3個(gè)服務(wù)
Creating service my_stack_provider-order
Creating service my_stack_discovery
Creating service my_stack_provider-user
執(zhí)行docker stack ps my_stack
可以看到該stack下的運(yùn)行分配情況
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
t298osrl5krl my_stack_provider-user.1 192.168.30.205:5000/provider-user:0.0.1-SNAPSHOT worker-node Running Running 6 minutes ago
q9ophua59qhy my_stack_discovery.1 192.168.30.205:5000/discovery:0.0.1-SNAPSHOT manager-node Running Running 5 minutes ago
ivqlgw6oecxv my_stack_provider-order.1 192.168.30.205:5000/provider-order:0.0.1-SNAPSHOT worker-node Running Running 6 minutes ago
ikhcxf8ffdgn my_stack_provider-user.2 192.168.30.205:5000/provider-user:0.0.1-SNAPSHOT manager-node Running Running 5 minutes ago
27gr1q9urt3m my_stack_provider-order.2 192.168.30.205:5000/provider-order:0.0.1-SNAPSHOT manager-node Running Running 5 minutes ago
訪問(wèn)任意一臺(tái)都可以成功獲取結(jié)果
- image.png
- image.png
- image.png
搭建Portainer
Portainer是一個(gè)管理swarm的UI工具松忍,官方網(wǎng)站 https://www.portainer.io/
在管理節(jié)點(diǎn)上執(zhí)行
docker service create \
--name portainer \
--publish 9000:9000 \
--constraint 'node.role == manager' \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
portainer/portainer \
-H unix:///var/run/docker.sock
執(zhí)行成功后訪問(wèn) http://192.168.30.206:9000蒸殿,第一次進(jìn)入需要設(shè)置密碼
- image.png
進(jìn)入主頁(yè)可以看到一個(gè)primary端點(diǎn),里面有我們之前創(chuàng)建的stack
- image.png
點(diǎn)進(jìn)去可以看到整體信息
- image.png
通過(guò)UI界面部署項(xiàng)目
- 首先需要配置遠(yuǎn)程倉(cāng)庫(kù)的地址和認(rèn)證信息鸣峭,點(diǎn)擊左側(cè)菜單欄的 Registries宏所,選擇Add registry,選擇 Custom registry摊溶,填寫(xiě)倉(cāng)庫(kù)信息和賬號(hào)密碼爬骤,點(diǎn)擊Add registry
- image.png
- 創(chuàng)建stack
點(diǎn)擊左側(cè)菜單欄的Stacks,刪除之前創(chuàng)建的my_stack莫换,然后新建兩個(gè)stack霞玄,StackA和StackB,我們可以把很少更新的discovery拉岁,config等放入StackB坷剧,把經(jīng)常要更新的其他微服務(wù)放入StackB。
新建的時(shí)候可以直接編輯stack.yml文件喊暖,然后點(diǎn)擊 deploy
StackA
- image.png
StackB
- image.png
- 查看日志
進(jìn)入某個(gè)stack惫企,點(diǎn)擊某個(gè)服務(wù)左側(cè)箭頭,點(diǎn)擊某個(gè)任務(wù)的Actions下的第一個(gè)logs,可以看到打印的日志
- image.png
- image.png
- 更新
選中某個(gè)服務(wù),點(diǎn)擊上方的Update狞尔,選擇pull lastest image verion就可以拉取最新的鏡像然后更新
-
image.png
系統(tǒng)會(huì)自動(dòng)依次停止然后啟動(dòng)
- image.png