天天看點

docker-swarm相關指令和注意事項

在k8s出現之後,docker-swarm使用的人越來越少,但在本地內建開發環境的搭建上,使用它還是比較輕量級的,它比docker-compose最大的好處就是容器之間的共享和服務的治理,你不需要links容器,也不知道關心失敗之後的重新開機,這些都于swarm來實作。

對于docker-compose和docker-swarm的分工

  1. docker-compose用來進行鏡像的編排,同時将多個相關鏡像建構
  2. 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遠端,而如果太依賴遠端也不是好事 ,你可以把倉庫下載下傳到本地,然後挂載到容器目錄即可,但在進行操作時也有一些需要注意的點:

  1. 配置中心的目錄必須是git倉庫,預設是master分支
  2. 使用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部署環境

  1. 一定要設定

    eureka.instance.hostname

    為主控端IP,或者容器裡feign無法通路,主控端調試沒問題
  2. docker-compose裡的服務名要與spring.application.name區分開,避免沖突,前者在容器裡可以ping通,後者隻在feign裡有效
  3. 配置健康檢查位址,一般都在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

支付寶掃一掃,為大叔打賞!

docker-swarm相關指令和注意事項