docker swarm 搭建與服務更新

,docker swarm 是什麼html

Docker Swarm、Docker Machine與Docker Compose號稱Docker三劍客
Docker Swarm 和 Docker Compose 同樣,都是 Docker 官方容器編排項目,但不一樣的是,Docker Compose 是一個在單個服務器或主機上建立多個容器的工具,能夠將組成某個應該的多個docker容器編排在一塊兒,同時管理。
而 Docker Swarm 則能夠在多個服務器或主機上建立容器集羣服務,其主要做用是把若干臺Docker主機抽象爲一個總體,而且經過一個入口(docker stack)統一管理這些Docker主機上的各類Docker資源。前端

Swarm的基本架構以下圖所示,node

  • stack 是構成特定環境中的 service 集合, 它是自動部署多個相互關聯的服務的簡便方法,而無需單獨定義每一個服務。
  • stack file 是一種 yaml 格式的文件,相似於 docker-compose.yml 文件,它定義了一個或多個服務,並定義了服務的環境變量、部署標籤、容器數量以及相關的環境特定配置等。
二,啓動Swarm,並建立集羣
Docker 默認包含了 Swarm,所以能夠直接使用,初始化命令:docker swarm init 
docker swarm init --advertise-addr 192.168.100.129

此時將本機ip「192.168.100.126」,會默認當前節點爲 Leader,執行 docker info 查看linux

經過下面命令獲取加入token,其餘節點能夠用 manager 或者 worker 的身份加入到當前集羣web

docker swarm join-token [worker|manager]

須要加入的節點無需再執行「docker swarm init」初始化,直接加入節點便可spring

出錯了,須要在管理管設置防火牆docker

firewall-cmd --permanent --add-port=2377/tcp # 容許某端口放行

而後執行防火牆從新加載tomcat

firewall-cmd --reload

再次在須要加入的節點上執行加入服務器

這裏咱們加入2個節點,執行 docker info 查看微信

在管理端執行「docker info」 查看, 顯示工3個節點

 

脫離集羣

docker swarm leave 

結果以下:

三,docker-stack.yml文件編排

Docker stack 也是一個yaml文件,和一份docker-compose.yml文件差很少,指令也基本一致。可是與compose相比其不支持build、links和network_mode。Docker stack有一個新的指令deploy。

注:stack不支持的指令

Deploy是用來指定swarm服務部署和運行時的相關配置,而且只有使用docker stack deploy 部署swarm集羣時纔會生效。若是使用docker-compose up 或者docker-compose run時,該選項會被忽略。要使用deploy選項,compose-file中version版本要在3或3+。

下面經過一個demo說明 deploy關鍵選項version: "3.4"

version: "3.4"
services:
  demo-docker:
    image: ejiyuan/demo-docker
    ports:
      - 8081:8081
    environment:
      - DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip
      labels:
        com.example.description: "This label will appear on the web service"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      update_config:
        parallelism: 1
        delay: 10s
        order: start-first
  visualizer:
    image: dockersamples/visualizer
    ports:
      - "9080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
  portainer:
    image: portainer/portainer
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

visualizer,portainer 爲服務管理與監聽服務,這裏先不作詳細介紹

1,mode :global 全局(每一個羣集節點只有一個容器)replicated 副本(指定容器的數量)。默認值:replicated。

2,replicas:副本模式下每一個節點啓動副本的數量

3,endpoint_mode:指定swarm服務發現的模式

  • vip - Docker爲swarm集羣服務分配一個虛擬IP(VIP),做爲客戶端到達集羣服務的「前端」。Docker 在客戶端和可用工做節點之間對服務的請求進行路由。而客戶端不用知道有多少節點參與服務或者是這些節點的IP/端口。(這是默認模式)
  • dnsrr - DNS輪詢(DNSRR)服務發現不使用單個虛擬IP。 Docker爲服務設置DNS條目,使得服務名稱的DNS查詢返回一個IP地址列表,而且客戶端直接鏈接到其中的一個。若是您想使用本身的負載平衡器,或者混合Windows和Linux應用程序,則DNS輪詢功能很是有用。

4,labels:指定服務的標籤。這些標籤僅在服務上設置,而不在服務的任何容器上設置

5,resources:設置服務資源分配

  • limits:最大使用限制
  • reservations:表示預留,即最小使用
  • cpus: '0.50' 表示最大或預留50%
  • memory: 20M:表示最大或預留20M

6,restart_policy:配置在容器退出時是否並如何重啓容器。取代docker-compose 中的 restart指令。

  • condition :none、on-failure和any(默認any)
  • delay :在重啓嘗試之間等待多久(默認0)
  • max_attempts :嘗試重啓的次數(默認一直重啓,直到成功)
  • window : 在確實一個重啓是否成功前須要等待的窗口時間 

7,update_config :配置更新服務,用於無縫更新應用(rolling update)

  • parallelism:同一時間升級的容器數量
  • delay:容器升級間隔時間
  • failure_action:升級失敗後的動做(continue、rollback和pause。默認pause)。
  • monitor:更新完成後確實成功的時間(ns|us|ms|s|m|h)。(默認0s)
  • max_failure_ratio:更新期間容許的失敗率
  • order: 更新期間的操做順序。中止優先(舊任務在開始新任務以前中止)或者先啓動(首先啓動新任務,而且正在運行的任務短暫重疊)(默認中止優先)注意:只支持v3.4及更高版本。 

四,docker stack相關命令

1, docker stack deploy:部署新的堆棧或更新現有堆棧

docker stack deploy [OPTIONS] STACK

參數

  • --bundle-file:【實驗階段】分佈式應用程序包文件的路徑
  • -c --compose-file :Stack File 路徑
  • --prune:刪除再也不被引用的服務
  • --resolve-image: 查詢 Registry 以解決​​鏡像摘要和支持的平臺可選值:always(默認)、changed、never
  • --with-registry-auth:向 Swarm 代理髮送 Registry 認證詳細信息

私有倉庫須要攜帶"--with-registry-auth"參數,不然提示

image registry.cn-beijing.aliyuncs.com/ejiyuan/app:latest could not be accessed on a registry to record 
its digest. Each node will access registry.cn-hangzhou.aliyuncs.com/ejiyuan/app:latest,
possibly leading to different nodes running different

須要先登陸到阿里私有倉 

sudo docker login --username=ejiyuan@aliyun.com registry.cn-beijing.aliyuncs.com 

內網地址

sudo docker login --username=ejiyuan@aliyun.com registry-vpc.cn-beijing.aliyuncs.com

執行命令開始使用 docker-stack.yml 文件部署服務堆,堆名爲「test」

 docker stack deploy -c docker-stack.yml test --with-registry-auth

結果以下:

 2,docker stack ls:列出現有堆棧以及堆中的服務數量

docker stack ls [flags]

SERVICES 顯示堆中有多少個服務

3,docker stack ps:列出堆棧中的任務

docker stack ps [OPTIONS] STACK [flags]

對應 docke run爲 上圖中,綠、藍、黃分別表明上面文件中定義的三個服務

  • 第一行,任務NAME 「test_demo-docker.1」,"test"表示服務棧名稱,「_」後面的demo-docker是文件中定義的服務名稱,「.1」表示第一個實例;
  • 第四列 NODE表示所在的節點;
  • 第五列:desired state 狀態running運行中;
  • 下面一行 「\_」表示爲第一次重啓,跟部署配置文件(docker-stack.yml)中的「restart_policy」,重啓策略有關,文件中設置了 出錯重啓,最多重啓3次,因此3行的,「\_」,第五列狀態顯示爲 shutdown中止
  • 第七列 顯示錯誤緣由
  • task:non-zero exit(137) 錯誤緣由服務容器內容不足,上面部署配置文件(docker-stack.yml)中設置了內存爲20M,因此致使服務反覆重啓知道達到  max_attempts 限制, by:https://success.docker.com/article/what-causes-a-container-to-exit-with-code-137 

4,docker stack services :列出堆棧中的服務 

docker stack services [OPTIONS] STACK [flags]

  • NAME 表示堆中的服務
  • MODE 文件中配置的啓動模式,這裏都是 replicated (副本模式)
  • REPLICAS 表示正在運行的/啓動的副本數量

5,docker stack rm :刪除一個或多個堆棧

 docker stack rm STACK [STACK...] [flags]

六,服務升級

docker service upadte 命令參數詳解

  • --force 強制更新重啓服務,不管是否配置或鏡像改變都更新
  • --image <image:tag> 制定更新的鏡像
  • --with-registry-auth 向 Swarm 代理髮送 Registry 認證詳細信息,私有倉庫須要攜帶該參數

1,更新鏡像:

docker service update --image ejiyuan/demo-docker:latest test_demo-docker

使用 portainer/portainer:latest鏡像,更新  portainer_portainer服務,此方法執行前,必須將 鏡像文件上傳到遠程倉中,程序會自動拉取遠程倉中鏡像文件與啓動服務的鏡像對比,若是沒有變化不會啓動更新,也不會重啓服務

 

即便設置了update_config.order: start-first,服務會先啓動在中止,可是tomcat 啓動 spring 項目須要必定時間,這段時間服務是不可用的,可是服務狀態是Runing的,因此,這裏啓用兩個副本,每次更新一個,等待一個服務啓動完成後,在執行另外一個更新,主要目的是爲了,無縫的升級系統,具體update_config.delay設置爲多少能夠參考tomcat的啓動時間

Tomcat started on port(s): 8081 (http) with context path ''
Started DemoDockerApplication in 17.292 seconds (JVM running for 18.745)

注意:若是有多個同名images,最後一次編譯的會被加tag :latest,push時 要加上

docker push registry.cn-beijing.aliyuncs.com/ejiyuan/demo-docker:latest

2,更新節點數目

docker service scale test_demo-docker=3

運行結果:

3,添加或者更新一個對外端口 

docker service update -–publish-add 8090 test_demo-docker 

 結果以下

七,更新節點

docker node update [OPTIONS] NODE [flags]

參數:

  • --availability 節點的可用性(有效/暫停/耗盡)
  • --label-add 添加或更新節點標籤(key = value)
  • --label-rm 刪除節點標籤(若是存在)
  • --role 節點的做用(worker / manager)

NODE:節點名稱 可使用 「docker info」 查看獲得

 

執行下面語句查看節點詳情

docker node inspect atv61b72x9qa5dpbrew2n016g

該命令只會更改角色,部分權限並無當即更新,所以執行服務操做時有可能提示該錯誤Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded

當即生效更新節點爲manger 執行

docker node promote NODE [NODE...]

七,經常使用命令

 

 

經常使用命令

  • docker swarm 命令用於管理 Swarm 羣集
命令 描述
docker swarm init 初始化一個 swarm 羣集
docker swarm join 加入羣集做爲節點或管理器
docker swarm join-token 管理用於加入羣集的令牌
docker swarm leave 離開 swarm 羣集
docker swarm unlock 解鎖 swarm 羣集
docker swarm unlock-key 管理解鎖鑰匙
docker swarm update 更新 swarm 羣集
  • docker node 命令用於管理 Swarm 羣集中的機器節點
命令 描述
docker node demote 從 swarm 羣集管理器中降級一個或多個節點
docker node inspect 顯示一個或多個節點的詳細信息
docker node ls 列出 swarm 羣集中的節點
docker node promote 將一個或多個節點推入到羣集管理器中
docker node ps 列出在一個或多個節點上運行的任務,默認爲當前節點
docker node rm 從 swarm 羣集刪除一個或多個節點
docker node update 更新一個節點
  • docker service 命令用於管理服務
命令 描述
docker service create 建立服務
docker service inspect 顯示一個或多個服務的詳細信息
docker service logs 獲取服務的日誌
docker service ls 列出服務
docker service rm 刪除一個或多個服務
docker service scale 設置服務的實例數量
docker service update 更新服務
docker service rollback 恢復服務至update以前的配置
七,注意:
若是一臺機器啓用多個服務注意,合理分配cpu與內存資源,因tomcat在啓動編譯時會很吃內存,且docker是多線程啓動的,全部最好是限定一下(設置resources.limits)否者會致使內存在同一時刻用光,某些服務啓動失敗固然也但是設置出錯重啓(restart_policy.condition:on-failure),另外設置resources.reservations要注意,不要超出總內存或cpu百分比,否者會致使後面服務沒法獲取cpu或內存資源出現「no suitable node (insufficien」錯誤(這個錯誤很奇怪,某個service不啓動,也不輸出日誌,使用「docker stack ps [xxxx]」查看狀態會顯示此錯誤)沒法啓動
八,參考

Docker swarm搭建總結

Docker 三劍客之 Docker Swarm

使用 Docker Swarm 管理 Docker 集羣

如何滾動更新 Service?- 天天5分鐘玩轉 Docker 容器技術(102)

Docker 小記 — 微信鬥牛棋牌源碼搭建Compose & Swarm

 Docker swarm - 使用體驗 1+2

docker node update命令

Docker(六):Docker 三劍客之 Docker Swarm

Docker 引擎的 Swarm 模式:入門教程

相關文章
相關標籤/搜索