在k8s出現之後,docker-swarm使用的人越來越少,但在本地內建開發環境的搭建上,使用它還是比較輕量級的,它比docker-compose最大的好處就是容器之間的共享和服務的治理,你不需要links容器,也不知道關心失敗之後的重新開機,這些都于swarm來實作。
對于docker-compose和docker-swarm的分工
- docker-compose用來進行鏡像的編排,同時将多個相關鏡像建構
- docker-swarm用來啟動和管理容器,它不能建構鏡像
建立compose檔案,不支援build,links,depends_on
services:
db:
image: arungupta/couchbase:latest
ports:
- 8091:8091
- 8092:8092
- 8093:8093
- 11210:11210
swarm初始化
docker swarm init
建立服務
docker stack deploy --compose-file=docker-compose-swarm.yml lind
檢視所有服務清單
docker stack ls
檢視指定服務
docker stack services lind
更新某個服務
docker service update lind_service1 //有時我們的lind_service1依賴于configserver,當後者沒有重新開機動,前者會一直報錯,然後使用預設的配置,由于預設配置為localhost,是以就出現了連接配接失敗的情況
删除服務
docker stack rm lind
删除指定服務清單
docker service rm $(docker service ls | awk '$2 ~ /lind_service/ {print $1}')
删除某個鏡像下的容器
docker rm -f $(docker ps | awk '$2 ~ /lind/ {print $1}')
痛點
configserver是比較低層的服務,所有項目的配置都來自于這個服務,我們拿eureka配置為例,如果項目從配置中心拿不到它的配置,會使用預設的localhost:8761做為連接配接位址,這在某些不是localhost:8761的環境下,這簡直就成了災難。
解決方法:把configserver和eureka兩個服務越來後,再把具體項目的容器删除,這時docker service會重新啟動具體項目的容器,這時,它們就可以正常工作了。
配置中心使用本地倉庫
配置中心的配置檔案一般存儲在git遠端,而如果太依賴遠端也不是好事 ,你可以把倉庫下載下傳到本地,然後挂載到容器目錄即可,但在進行操作時也有一些需要注意的點:
- 配置中心的目錄必須是git倉庫,預設是master分支
- 使用docker-comopse部署時,使用volumes把宿主目錄挂載到容器目錄,例如固定為config_repo,它可以在yml檔案裡提前聲明。
- compose檔案
configserver:
image: swarm_configserver
ports:
- "6200:6200"
- "6201:6201"
environment:
SPRING_PROFILES_ACTIVE: development
PORT: 6200
BG_PORT: 6201
EUREKA_PORT: 6761
MY_IP: 192.168.170.30
volumes:
- /Users/lind.zhang/github/config_repo:/config_repo
- bootstramp.yml檔案
spring:
profiles: development
cloud:
config:
server:
git:
uri: /config_repo
本機使用docker swarm部署環境
- 一定要設定
為主控端IP,或者容器裡feign無法通路,主控端調試沒問題eureka.instance.hostname
- docker-compose裡的服務名要與spring.application.name區分開,避免沖突,前者在容器裡可以ping通,後者隻在feign裡有效
- 配置健康檢查位址,一般都在application裡設定,其它項目配置繼承即可
spring:
config:
name: ${spring.application.name}
cloud.config:
allowOverride: true
overrideNone: false
overrideSystemProperties: false
name: ${spring.application.name}
profiles.active: development
management:
context-path: /manage #從新設定監控檢查的位址,預設為/actuator
security.enabled: false
health:
diskspace.enabled: false
endpoint:
health.enabled: true
endpoints:
web:
path-mapping.health: status
base-path: /manage #since spring boot 2.0.0 M6
expose: info,status,health
eureka:
instance:
statusPageUrlPath: ${management.context-path}/info
healthCheckUrlPath: ${management.context-path}/${management.endpoints.web.path-mapping.health}
preferIpAddress: false
hostname: 192.168.170.30
client:
fetchRegistry: true
registryFetchIntervalSeconds: 5
healthcheck:
enabled: true
建立client,成功通路
@FeignClient("service2")
public interface Service2Client {
@GetMapping("/get")
String get();
}
@Autowired
Service2Client service2Client;
@GetMapping("/")
public String index() {
return "hello index service1:" + service2Client.get();
}
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!
