Docker集群管理之swarm


  1. Docker集群管理
  2. Swarm基礎

    Swarm在Docker1.12版本之前屬於一個獨立的項目,在Docker1.12版本發布之后,該項目合並到了Docker中,成為Docker的一個子命令,即Swarm集群模式。目前,Swarm是Docker社區提供的唯一的一個原生支持Docker集群管理的工具。它可以把多個Docker主機組成的系統轉換為單一的虛擬Docker主機, 使得容器可以組成跨主機的子網網絡。

    在Docker1.12版本之前,Docker在集群管理上一直依靠第三方工具。以前的Docker服務自身只能在單台主機上進行操作, 官方並沒有真正意義上的集群管理方案。 直到Docker 1.12版的發布,Docker引擎在多主機 、多容器的集群管理上才有了進一步的改進和完善,該版本的Docker內嵌了Swarm mode集群管理模式。從Docker 1.13版開始,DockerSwarm又有了更豐富的功能,比如正式 支持DockerStack等。

    原理如下圖所示,swarm 集群由管理節點(manager)和工作節點(work node)構成。

  • swarm mananger:負責整個集群的管理工作包括集群配置、服務管理等所有跟集群有關的工作。
  • work node:即圖中的 available node,主要負責運行相應的服務來執行任務(task)。

  1. Docker Swarm命令

     

     

     

     

    1.Swarm初始化docker swarm init

     

    初始化集群的子命令docker swarm init

     

     

    2.加入集群docker swarm join

    1. 管理添加節點的口令docker swarm join-token

    swarm添加節點時需要管理節點生成一個口令,待添加的子節點需要憑借這個口令才能加入集群,這個子命令docker swarm join-token更加簡單,主要用於管理集群口令,該子命令只能用於管理節點。

    --rotate表示持續輸出口令

     

    1. 離開集群docker swarm leave

    docker swarm leave用於退出當前集群

    1. 解鎖集群docker swarm unlock

    解鎖集群的命令docker swarm unlock,用於解除鎖定的swarm集群。

     

    1. 管理解鎖密鑰docker swarm unlock-key

    docker swarm unlock-key這個命令的選項與docker swarm join-token一致

     

    1. 更新集群docker swarm update

     

  2. Docker Node命令

     

    1. docker node demote

    將一個或多個節點從群集中的管理器降級。

    1. docker node inspect

    在一個或多個節點上顯示詳細信息

     

    3.docker node ls

    列出群中的節點

     

    4.docker node promote

    將一個或多個節點提升為群集中的管理器。

    5.docker node ps

    列出在一個或多個節點上運行的任務,默認為當前節點

     

    6.docker node rm

    從群中刪除一個或多個節點

    7.docker node update

    更新節點

     

  3. Docker Stack命令

     

    1. 部署Docker棧docker stack deploy

    1. 查看所有棧docker stack ls

     

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

     

    4.移除一個或多個堆棧docker stack rm

     

    5.列出堆棧中的服務docker stack services

     

  4. Docker集群網絡

    搭建一個Docker集群網絡,為了方便演示跨主機網絡,我們需要用到一個工具--Docker Machine,這個工具與Docker Compose,Docker Swarm一起稱為Docker三劍客。

    安裝machine

    base=https://github.com/docker/machine/releases/download/v0.16.2 &&curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && mv /tmp/docker-machine /usr/local/bin/docker-machine &&

    chmod +x /usr/local/bin/docker-machine

    這是因為沒有安裝virtualbox虛擬機,如下,先設置yum源,生成緩存。

    yum安裝virtualbox

    在創建虛擬機的時候報錯

    輸入/sbin/vboxconfig檢查配置,可以發現內核一些模塊未安裝,按照提示中的指引按照。

    yum install gcc make perl

    yum install kernel-devel-3.10.0-1160.31.1.e17.x86_64

     

    如果你的宿主機上的軟件為vmware要勾選下圖選項

     

     

     

     

    然后再到https://github.com/boot2docker/boot2docker/releases/

    下載boot2docker.iso文件放到/root/.docker/machine/cache下。

    沒有就創建。

    1.建立跨主機網絡

    首先使用docker machine創建一個虛擬機作為manager節點

    查看虛擬機的環境變量等信息,包括虛擬機的IP地址

    然后再創建一個節點作為work節點

    查看虛擬機

    目前兩台虛擬機是沒有聯系的,實際生產中是使用物理機或者是雲主機作為集群機器的,在這里使用的時machine創建的,還可以使用docker-machine ssh命令連接虛擬機。

    將manager1加入集群

    用--listen-addr指定監聽的IP與端口,實際的Swarm命令格式如下:

    docker swarm init --listen-addr <MANGER-IP>:<PORT>

    注意在machine創建的虛擬機才需要使用docker machine,目前docker machine正在被丟棄了。在這里我們使用它來建立虛擬機。並不是說swarm集群非得使用它。也就是說它就類似vmware軟件一樣,你也可以在vmware上建立多台虛擬機組成一個swarm集群,但是顯然這個比較麻煩多了。因為還需要自己配置主機。

    生產中實際是使用物理機和雲主機來搭建swarm集群。

    使用上面的token接下來把work1也加入集群。:

    上面在join命令中可以添加—listen-addr $WORKER1_IP:2377作為監聽設備,因為有時候可能會遇到把一個work節點提升為manager節點的可能,在這里就不需要了。

    注意:在遇到雙網卡的時候。可以指定使用一個IP,不然可能會報錯。

     

    初始化成功后。現在我們新建了一個有兩個節點的"集群",進入其中一個管理節點,使用Docker Node命令來查看節點信息:

    現在每個節點都歸屬於swarm,並都處在待機狀態。Manager1是領導者,work1是工人。

    我們繼續創建虛擬機manager2,worker2,worker3,現在共有五個虛擬機,使用docker-machine ls查看

    把其余虛擬機加入集群

    注意manager2是作為manager的級別加入集群,需要獲取manager的token,如果是作為worker節點就需要獲取worker節點的token。如下

    查看swarm集群的信息。

     

    還可以把宿主機加入到集群中,需要關閉宿主機防火牆,如下

     

    可以看到宿主機作為manager加入集群了,意味着在宿主機上就可以去管理集群了,不用再使用docker-machine ssh了。

    如果宿主機想要離開集群,則使用docker swarm leave ,manager節點需要—--force參數然后在集群中宿主機就會變為down狀態,然后docker node rm 節點ID 去除這個節點即可。

    查看網絡

     

    可以看到在swarm上默認已經有了一個名為ingress的overlay網絡,默認在swarm里使用,我們新建一個overlay網絡。

     

    現在一個跨主機的網絡已經搭建好了,目前是待機狀態。

     

    2.跨主機網絡上部署應用

    新建的節點是沒有鏡像的,需要的話要逐一pull到節點中。

    使用docker-machine ssh manager1 docker pull nginx:alpine

    每個節點執行一次,然后去查看鏡像是否存在即可。

     

    接下來我們在上面的虛擬機中部署nginx服務,

    查看服務狀態

    查看helloworld服務詳情

    可以看到nginx運行在worker1和manager2節點上。

    記住上面的名稱,現在看看兩個容器是否互通。

    首先使用machine進入manager2節點,然后使用docker exec -i命令進入容器中去ping運行在worker1的容器。

    然后進入worker1反過來ping

    可以看到是互通的。

    還可以在虛擬機ping另外虛擬機上的容器,不過延遲明顯變高。

    從網絡模型結構圖中可以看到,容器之間互ping屬於同一個子網的操作,因此ping值不高;而使用虛擬機內部的ping 命令去測試時相當於去另一個網絡的訪問,延遲就高了很多,盡管它們的物理地址都是同一個地點。

    Docker Network的overlay網絡模型結構如圖

    跨主機的兩個容器C和E實際處於一個網絡。

    刪除helloworld服務

     

     

     

     

     

     

  5. 現在來搭建一個nginx集群。並且可訪問

    查看服務運行狀態

     

    現在做一個實驗,殺死其中的一個節點。

    先查看容器所在節點

    其運行在manager1和manager2節點

    殺死manager1上的容器看看

    發現雖然manager1上的容器雖然退出了,但是在worker2上啟動了nginx,保持了副本為2.

    還可以增加副本

    以上是應用集群的一個簡單應用,還有更復雜的情況。

  6. Shipyard是一個基於Web的Docker管理工具, 支持多主機,可以把多個Docker主機上的容器進行統一管理、可以查看鏡像、甚至構建鏡像,並提供RESTful等。如果Shipyard要管理和控制Docker主機的話,那么需要先修改Docker主機上的默認配置,使其支持遠程管理。

    因此項目代碼已經不被維護了。在這里不再說明。

     

     

  7. Portainer是一個全面的Docker UI監控管理工具,很重要的一點是它極其輕量只有4MB大小,Portainer可以作為Docker引擎或Swarm群集上的輕量級Docker容器運行。因此,部署Portainer只需要在Docker機器上運行一個命令。

    安裝

    現在訪問9000端口。自行設置密碼大於8位,然后連接本地環境即可,如下

    左邊列表是資源欄,鏡像,容器,等都可以查看。功能還是可以的,可以查看swarm集群,遠程docker的資源,還可以拉取鏡像,一般的維護功能是夠的。

    以上是單機版,還可以進行集群管理。詳細就不再說明。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM