Docker 三劍客之 Docker Swarm

来源:http://www.cnblogs.com/xishuai/archive/2017/12/06/docker-swarm.html
-Advertisement-
Play Games

上一篇: "Docker 三劍客之 Docker Compose" 閱讀目錄: Docker Machine 創建 Docker 主機 Docker Swarm 配置集群節點 Docker Service 部署單個集群服務 Docker Stack 部署多個集群服務,以及 GUI 管理頁面 dock ...


上一篇:Docker 三劍客之 Docker Compose

閱讀目錄:

  • Docker Machine 創建 Docker 主機
  • Docker Swarm 配置集群節點
  • Docker Service 部署單個集群服務
  • Docker Stack 部署多個集群服務,以及 GUI 管理頁面
  • docker-machine、docker swarm、docker node、docker service 和 docker stack 常用命令

Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排項目,但不同的是,Docker Compose 是一個在單個伺服器或主機上創建多個容器的工具,而 Docker Swarm 則可以在多個伺服器或主機上創建容器集群服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。

從 Docker 1.12.0 版本開始,Docker Swarm 已經包含在 Docker 引擎中(docker swarm),並且已經內置了服務發現工具,我們就不需要像之前一樣,再配置 Etcd 或者 Consul 來進行服務發現配置了。

1. Docker Machine 創建 Docker 主機

在進行 Docker Swarm 配置之前,我們還需要說下 Docker 另外一個官方工具 Docker Machine(也是 Docker 三劍客之一),其作用就是快速幫助我們搭建 Docker 主機環境,比如我們要使用 Docker Swarm,就必須有很多的 Docker 主機來進行操作,Docker Machine 就是最理想的工具。

因為我是在 Mac OS 上進行操作的,並且 Docker for Mac 已經包含了 Docker Machine(docker machine),所以我不需要再額外進行安裝了,如果使用 Linux 系統的話,安裝也非常簡單,命令:

$ sudo curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
$ sudo chmod +x /usr/local/bin/docker-machine

好了,我們先使用 Docker Machine 創建四個 Docker 主機,命令:

$ docker-machine create -d virtualbox manager1 && 
docker-machine create -d virtualbox manager2 && 
docker-machine create -d virtualbox worker1 && 
docker-machine create -d virtualbox worker2

Running pre-create checks...
(worker1) No default Boot2Docker ISO found locally, downloading the latest release...
(worker1) Latest release for github.com/boot2docker/boot2docker is v17.11.0-ce
(worker1) Downloading /Users/xishuai/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v17.11.0-ce/boot2docker.iso...

執行上面命令,你會發現速度巨慢(如上),原因是從 GitHub 上下載一個boot2docker.iso文件(國內網路沒辦法),怎麼解決呢?很簡單,我們使用翻X的瀏覽器手動下載boot2docker.iso文件,然後拷貝到對應目錄下(我電腦的目錄/Users/xishuai/.docker/machine/cache/),然後再執行上面的命令,發現速度快的一批。

我們可以查看下創建的 Docker 主機信息,命令:

$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
manager1   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.11.0-ce   
manager2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.11.0-ce   
worker1    -        virtualbox   Running   tcp://192.168.99.102:2376           v17.11.0-ce   
worker2    -        virtualbox   Running   tcp://192.168.99.103:2376           v17.11.0-ce   

可以看到,我們創建了四個 Docker 主機(兩個 Manager 和兩個 Worker),我們還可以連接到任何一臺伺服器進行操作,命令:

$ docker-machine ssh manager1
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.11.0-ce, build HEAD : e620608 - Tue Nov 21 18:11:40 UTC 2017
Docker version 17.11.0-ce, build 1caf76c

2. Docker Swarm 配置集群節點

我們執行下麵命令:

$ docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.99.100"
Swarm initialized: current node (n0ub7dpn90rxjq97dr0g8we0w) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-envtxo4dl6df2ar3qldcccfdg 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

上面是在manager1主機上,創建一個 Docker Swarm 管理節點(初始化集群的時候,會自動把當前節點設置為管理節點)。

接著,我們在worker1worker2主機上,創建兩個工作節點,並加入到集群中,命令:

$ docker-machine ssh worker1 "docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-envtxo4dl6df2ar3qldcccfdg 192.168.99.100:2377"
This node joined a swarm as a worker.

$ docker-machine ssh worker2 "docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-envtxo4dl6df2ar3qldcccfdg 192.168.99.100:2377"
This node joined a swarm as a worker.

還有另外一個manager2主機,需要配置為管理節點,我們需要先在manager1主機上,獲取管理節點對應的token,然後再配置為管理節點,命令:

$ docker-machine ssh manager1 "docker swarm join-token manager"
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-0koz1b98sco8r5cn3g61eahnu 192.168.99.100:2377

$ docker-machine ssh manager2 "docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-0koz1b98sco8r5cn3g61eahnu 192.168.99.100:2377"
This node joined a swarm as a manager.

配置好之後,我們進入manager1主機內(上面的命令也可以在主機內執行),然後查看集群節點的信息,命令:

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
n0ub7dpn90rxjq97dr0g8we0w *   manager1            Ready               Active              Leader
t4cy67qp0bf2spgabsutwxnzt     manager2            Ready               Active              Reachable
if0kmzp4ww3oy57y7cha7v36t     worker1             Ready               Active              
jgg61cujzaeb3du5796fm0x2g     worker2             Ready               Active       

Leader表示當然集群的頭,Reachable可以理解為頭的候選人,頭一掛掉它就頂上去了。


需要註意的是,我當天配置好之後,把所有的 Docker 主機都stop了,然後隔天重新start之後,出現了下麵問題:

docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.

好像是集群節點丟失了頭,相關問題:如何處理 docker swarm 集群"The swarm does not have a leader"問題,按照文章進行解決:

$ docker swarm init --force-new-cluster
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (10.0.2.15 on eth0 and 192.168.99.102 on eth1) - specify one with --advertise-addr
$ docker swarm init --force-new-cluster --advertise-addr 192.168.99.102
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
$ docker node ls
卡死
$ docker-machine restart manager1 
重啟不了,一直轉圈

沒辦法,後來我只能刪掉四個 Docker 主機,重新進行創建了。

3. Docker Service 部署單個集群服務

在部署集群服務之前,我們需要做些準備工作,因為 Docker 主機中沒有配置 Docker 鏡像加速地址,所以在拉取官方鏡像的時候,肯定會非常慢,除了配置 Docker 鏡像加速地址之外,我們還可以使用 Docker 私有鏡像倉庫,來解決這個問題。

參考文章:Ubuntu Docker Registry 搭建私有倉庫

這邊,我再簡單說明下配置步驟,首先,在 Mac OS 上執行下麵命令:

$ docker run -d -v /Users/xishuai/Documents/Docker:/var/lib/registry -p 5000:5000 --restart=always --name registry registry

$ docker tag nginx 192.168.99.1:5000/nginx:latest && 
docker push 192.168.99.1:5000/nginx:latest && 
docker pull 192.168.99.1:5000/nginx:latest

$ curl http://192.168.99.1:5000/v2/_catalog
{"repositories":["nginx"]}

我們在 Mac OS 上創建了一個私有倉庫容器,並把nginx鏡像放到私有倉庫中,因為沒有使用 Https,所以在拉取和推送鏡像的時候,會報如下錯誤(Mac OS 和 Docker 主機都會報錯):

$ docker pull 192.168.99.1:5000/nginx:latest
The push refers to a repository [192.168.99.1:5000/nginx]
Get https://192.168.99.1:5000/v1/_ping: http: server gave HTTP response to HTTPS client

解決方式,我們需要分別在四個 Docker 主機中添加配置(Docker for Mac 在管理界面配置即可),命令:

$ sudo touch /etc/docker/daemon.json && 
sudo chmod 777 /etc/docker/daemon.json && 
sudo echo '{ "insecure-registries":    ["192.168.99.1:5000"] }' > /etc/docker/daemon.json

然後重啟四個 Docker 主機(Docker for Mac 也需要重啟),命令:

$ docker-machine restart manager1 && 
docker-machine restart manager2 && 
docker-machine restart worker1 && 
docker-machine restart worker2

上面比較啰嗦,我們接下來正式部署集群服務,還是拿nginx鏡像做為示例,命令(docker service create命令詳細說明):

$ docker service create --replicas 4 -p 8088:80 --name nginx 192.168.99.1:5000/nginx:latest
ap8h8srb8yh3mni0h2nz61njz
overall progress: 4 out of 4 tasks 
1/4: running   [==================================================>] 
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 
verify: Service converged 

需要註意的是,--replicas 4表示創建服務的實例個數(預設是一個),啥意思?比如4,就是在四個 Docker 主機上,分別創建一個nginx服務,如果是3,那就是三個 Docker 主機,或者你可以理解為 Docker 主機的個數,另外,REPLICAS會有進度顯示,並且執行是非同步的。

我們也可以手動設置實例個數,命令:

$ docker service scale nginx=4

部署好服務後,我們就可以進行查看了,命令:

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                            PORTS
ap8h8srb8yh3        nginx               replicated          4/4                 192.168.99.1:5000/nginx:latest   *:8080->8080/tcp

$ docker service ps nginx
ID                  NAME                IMAGE                            NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
l2rdrwzs5zog        nginx.1             192.168.99.1:5000/nginx:latest   manager1            Running             Running about a minute ago                       
vsfczzbwanx3        nginx.2             192.168.99.1:5000/nginx:latest   manager2            Running             Running about a minute ago                           
qtbgw5h6dsi9        nginx.3             192.168.99.1:5000/nginx:latest   worker              Running             Running about a minute ago                           
za2ejnvb3n6z        nginx.4             192.168.99.1:5000/nginx:latest   worker2             Running             Running about a minute ago

我們任意使用四個 Docker 主機中的一個 IP 地址,瀏覽器打開:http://192.168.99.100:8088/

4. Docker Stack 部署多個集群服務,以及 GUI 管理頁面

docker service部署的是單個服務,我們可以使用docker stack進行多服務編排部署,使用的同樣是docker-compose.yml配置文件,示例:

version: "3"

services:
  nginx:
    image: 192.168.99.1:5000/nginx:latest
    ports:
      - 8088:80
    deploy:
      mode: replicated
      replicas: 4

  visualizer:
    image: 192.168.99.1:5000/dockersamples/visualizer:latest
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

  portainer:
    image: 192.168.99.1:5000/portainer/portainer:latest
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

如上所示,我們總共需要部署三個服務,出了nginx服務作為示例之外,visualizer官方地址)和portainer官方地址)都是集群 GUI 管理服務。

部署命令:

$ docker stack deploy -c docker-compose.yml deploy-demo
Creating service deploy-demo_nginx
Creating service deploy-demo_visualizer
Creating service deploy-demo_portainer

部署成功之後,我們可以查看具體詳情,命令:

$ docker stack ls
NAME                SERVICES
deploy-demo         3

查看visualizerGUI 集群管理,瀏覽器打開:http://192.168.99.100:8080/

查看portainerGUI 集群管理,需要先配置賬號信息,瀏覽器打開:http://192.168.99.100:9000/

可以看到,portainervisualizer強大太多了,甚至我們所有的操作都可以在portainer上完成。

5. docker-machine、docker swarm、docker node、docker service 和 docker stack 常用命令

docker-machine 常用命令

命令 說明
docker-machine create 創建一個 Docker 主機(常用-d virtualbox
docker-machine ls 查看所有的 Docker 主機
docker-machine ssh SSH 到主機上執行命令
docker-machine env 顯示連接到某個主機需要的環境變數
docker-machine inspect 輸出主機更多信息
docker-machine kill 停止某個主機
docker-machine restart 重啟某台主機
docker-machine rm 刪除某台主機
docker-machine scp 在主機之間複製文件
docker-machine start 啟動一個主機
docker-machine status 查看主機狀態
docker-machine stop 停止一個主機

docker swarm 常用命令

命令 說明
docker swarm init 初始化集群
docker swarm join-token worker 查看工作節點的 token
docker swarm join-token manager 查看管理節點的 token
docker swarm join 加入集群中

docker node 常用命令

命令 說明
docker node ls 查看所有集群節點
docker node rm 刪除某個節點(-f強制刪除)
docker node inspect 查看節點詳情
docker node demote 節點降級,由管理節點降級為工作節點
docker node promote 節點升級,由工作節點升級為管理節點
docker node update 更新節點
docker node ps 查看節點中的 Task 任務

docker service 常用命令

命令 說明
docker service create 部署服務
docker service inspect 查看服務詳情
docker service logs 產看某個服務日誌
docker service ls 查看所有服務詳情
docker service rm 刪除某個服務(-f強制刪除)
docker service scale 設置某個服務個數
docker service update 更新某個服務

docker stack 常用命令

命令 說明
docker stack deploy 部署新的堆棧或更新現有堆棧
docker stack ls 列出現有堆棧
docker stack ps 列出堆棧中的任務
docker stack rm 刪除堆棧
docker stack services 列出堆棧中的服務
docker stack down 移除某個堆棧(不會刪除數據)

參考資料:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Dapper介紹 Dapper是.Net下的一個輕量級ORM框架.在小型工具向的項目下,使用Dapper會使資料庫操作層代碼更加優雅. Dapper的使用 在項目中使用引用Dapper非常簡單,你可以選擇兩種方式: 1.在NuGet引用 2.Github下載源代碼,添加到項目當中去 Dapper 項 ...
  • 開發C#的程式,寫到屬性property時,我們可以在Set方法中做一些簡單的規則驗證:如下麵,Insus.NET寫一個Age屬性,只允許用戶輸入10以內的數字: class AA { private int _Age; public int Age { get { return _Age; } s ...
  • 本著開發與實施分離的思想,設計一個通用的報表設計窗體顯得尤為重要(下圖為圖一): 要求與優點: I、報表設計窗體支持所有單據調用,一種單據支持多個列印模板。 II、報表模板存儲在資料庫中。一是支持客戶端設計及保存模板,二是一次修改所有客戶端生效。 III、點擊保存是將模板保存在資料庫中,點擊另存為可 ...
  • 周日外出去玩,出行方式有步行,騎行,公車。每個人因人或環境等等因素而選擇的方式有所不同。簡單工廠是符合此類型的。只有在運行時,才知道使用的哪種方法。創建一個抽象類Base: public abstract class Base { public abstract string Mode(); } 下 ...
  • 一、WCF服務應用程式與WCF服務庫 我們在平時開發的過程中常用的項目類型有“WCF 服務應用程式”和“WCF服務庫”。 WCF服務應用程式,是一個可以執行的程式,它有獨立的進程,WCF服務類契約的定義,可以直接看到運行的效果。此項目模板基於IIS托管的程式,如本系列的第一節所示。在開發基於IIS托 ...
  • (一)搭建Spring.NET環境常見的DLL 1.spring.core --整個框架的基礎,實現了依賴註入的功能 2.Spring.AOP--提供面向方面編程(aop)的支持 3.Spring.Data--a定義了一個抽象的數據訪問層,可以跨越各種數據訪問技術(從ADO.NET到各種orm)進行 ...
  • mysql安裝後服務啟動不了 1.1 前言 最近真的是倒霉到家,裝個mysql都能把所有的問題給問候了一遍······不過這也是一個寶貴的經驗,得好好總結下,畢竟也不知道以後會不會再次遇到。如果有網友也能像我這樣倒霉,但是能夠幸運地看到我這個文章,並且真正解決問題,那我就欣慰了。 1.2 我的倒霉過 ...
  • 我想寫一個簡單的系列文章。主題很簡單,就是記錄下麵對上傳視頻需求時,攻城獅和普通人(泛指所有非技術人員)的一些區別。當然,從需求分析到最終完整實現,每個步驟都是有乾貨。我會儘量避免一些偏情緒化的表述。更多的時候,我們應該把註意力集中在各個需求點本身的技術實現上。 這個系列的主要目的,就是秀一下我們... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...