Docker Swarm學習筆記一

Docker Swarm概述

Docker Swarm是Docker官方提供的集羣工具。它能夠將一些關聯的Docker主機轉變成一個虛擬Docker主機。由於Docker Swarm符合Docker API的標準,任何已經能夠與Docker守護進程通訊的工具均可以使用Swarm來透明地擴展到多個主機。支持工具包括:node

  • Dokku程序員

  • Docker Composedocker

  • Docker Machineshell

  • Jenkinsbootstrap

固然,Docker客戶端自己也是被支持的,而Docker Swarm支持的工具還不止這些。
如同其餘的Docker項目,Docker Swarm依然遵循着「swap, plug, and play」的原則。segmentfault

理解Swarm集羣建立

建立一個Swarm集羣的第一步是從網上拉取Docker Swarm鏡像。而後,你可使用Docker配置Swarm manager和全部節點運行Docker Swarm。步驟:windows

  • 在每一個節點上打開一個TCP端口用於跟Swarm manager通訊後端

  • 在每一個節點上安裝Dockerapi

  • 建立和管理TLS證書以保護集羣ssh

對於有經驗的管理員或者程序員來講,手動安裝Docker Swarm的方法是最好的。另外也能夠用docker-machine來安裝。使用Docker Machine能夠快速的在雲供應商或者你本身的數據中心安裝Docker Swarm。若是你的本地主機已經安裝了虛擬機,那麼你能夠在本地環境中使用Docker Machine快速的構建和瀏覽Docker Swarm。這種方法會自動生成證書以保護你的集羣。
若是是第一次使用Swarm,官方建議先使用Docker Machine。這裏的Docker Machine是Docker官方提供的Docker Toolbox中的工具之一,主要適用於Mac和Windows系統。而本人此次學習是使用的Ubuntu系統和Ubuntu Server系統,因此這裏我沒有用此方法,想要了解此法請參照官方指南
使用Docker Swarm的發現服務功能(Discovery services)能夠動態的配置和管理容器的服務。想要了解更多關於Discovery services的信息請參照官方文檔
還有一些其餘的相關信息:如Docker Swarm API和Advanced Scheduling(包含Docker Swarm strategiesSwarm filters)

安裝Docker Swarm的方式

  • 安裝Docker Swarm有兩種方式:

    • 直接以swarm爲鏡像模板啓動容器;

    • 在系統中安裝swarm的二進制可執行文件。

  • 官網也列舉出了這兩種方法的優缺點:

    • 以swarm鏡像啓動容器:

      • 無需在系統中安裝可執行的二進制文件;

      • 用docker run命令每次均可以獲取並運行最近版本的鏡像;

      • 容器是Swarm與主機環境相隔離,無需維護shell的路徑和環境。

    • 在系統中安裝swarm:

      • Swarm項目的開發者在測試代碼變動的過程當中,無需在運行該二進制文件前進行容器化(「containerizing」)操做。

所以,官方的推薦的方式也是以Swarm鏡像啓動容器的方式,並且官方給出的指導文檔也都是採用的此種方法。

構建Swarm集羣

關於Swarm集羣的構建,官方依然給了兩種

由於習慣了Hyper-v,若是要使用第一種方法必需要替換爲Oracle VM VirtualBox(點擊瞭解更多),這裏計劃是用Hyper-v建立虛擬機,而後安裝Ubuntu Server系統,而後對第二種方法進行實踐。這裏只簡單提一下第一種方法的步驟

  1. 安裝Docker Toolbox(Install Docker Toolbox);

  2. 建立三個虛擬機運行Docker Engine(Create three VMs running Docker Engine);

  3. 建立一個Swarm發現服務的token(Create a Swarm discovery token);

  4. 建立Swarm的管理者和節點(Create the Swarm manager and nodes);

  5. 管理Swarm(Manage your Swarm);

每一步的具體操做請參考Docker的官方文檔
下面主要演示Docker Swarm在Linux系統中的使用,而官方文檔中用到的是AWS(Amazon Web Services)平臺,這裏咱們有選擇性的參照官方文檔繼續本身的操做。本次示例中用到了5個host,那麼這裏就建立5個虛擬機。

clipboard.png

在這裏個人
Docker01 和 Docker02 分別對應 manager0 和 manager1;
Docker04 和 Docker05 分別對應 node0 和 node1;
Docker03 對應 consul0;

  • 建立虛擬機

  • 安裝Ubuntu 16.04/15.04 Server (64-bit)系統

  • 開啓並配置ssh服務

  • 安裝Docker

  • 配置環境;
    這裏的配置環境主要是使用私有倉庫的配置和使用,請參照文章:批量上傳鏡像到私有倉庫

    # 在客戶端主機建立文件夾(DomainName:Port例如example.com:9527)
    mkdir -p /etc/docker/certs.d/DomainName:Port
    # 先將ca.crt文件傳到客戶端主機
    # 在ca.crt的當前目錄下將該證書複製到上面建立的文件夾
    cp ca.crt /etc/docker/certs.d/DomainName:Port/
    # 重啓docker服務
    service docker restart
    # 接下來就能夠從私有倉庫拉取鏡像或向其上傳鏡像了。
  • 創建了一個發現服務的後端;
    在這裏,你須要建立一個及其簡單的發現服務的後臺,Swarm集羣的管理者和節點經過這個後臺進行身份驗證,從而成爲集羣的一員。Swarm集羣的管理者也會利用這些信息去判斷哪些節點可以運行容器。爲了簡單起見,您要在同一主機Swarm集羣的管理者主機上運行一個consul守護進程。

    # 操做對象manager0和consul0
    # 命令
    docker run -d -p 8500:8500 --name=consul swarm/consul -server -bootstrap
  • 建立Swarm集羣;
    在建立完成發現服務的後臺以後就能夠開始建立集羣的管理者了。接下來會建立兩個Swarm集羣的管理者,第一個啓動的管理者將會成爲Swarm集羣的主管理者(primary manager)。也有文章稱其爲master,但那種說法已經被廢棄。第二個啓動的管理者能夠看做是備胎(replica),一旦主管理者掛掉,那麼備胎將升級爲主管理者。

    # 在高可用的Swarm集羣中建立主管理者
    # 操做對象 manager0 和 consul0
    # <manager0_ip> 和 <consul_ip>相同
    docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500
    
    # 操做對象 manager1
    docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager1_ip>:4000 consul://172.30.0.161:8500
    
    # 操做對象 node0 和 node1
    docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500
  • 操做Swarm集羣;

    # 獲取集羣的管理者和節點的信息
    # 操做對象 manager0 和 consul0
    docker -H :4000 info
    
    # 在Swarm集羣中運行應用
    docker -H :4000 run hello-world
    
    # 查詢Swarm集羣的哪一個節點在運行該應用
    docker -H :4000 ps
  • 測試Swarm集羣的故障;

    # 獲取swarm容器的id或名稱
    # 操做對象 manager0
    docker ps
    
    # 刪除或關閉當前的主管理者 manager0
    docker rm -f <id_name>
    
    # 建立或啓動Swarm集羣管理者 manager0
    docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500
    
    # 查看該容器的日誌
    sudo docker logs <id_name>
    
    # 獲取集羣管理者和節點的信息
    docker -H :4000 info
相關文章
相關標籤/搜索