1. 程式人生 > >乾貨|Docker Swarm叢集初探

乾貨|Docker Swarm叢集初探

點選上方“中興開發者社群”,關注我們

每天讀一篇一線開發者原創好文

640?wx_fmt=png&wxfrom=5&wx_lazy=1

作者簡介

作者王帥是中興通訊的一名工程師,對開源有著非常濃厚的興趣,酷愛容器化方面的技術。這篇文章也是對容器化技術的初步探索,帶來關於docker容器叢集非常有趣的探索,後續作者也將會更加深入研究,爭取將更酷的技術以更加簡單易懂的方式展現給大家。

前言

相信Docker技術大家都有所瞭解,單個Docker能發揮的作用畢竟有限,也不便於管理,所以Docker得組叢集來使用才能發揮強大的技術優勢。既然要組叢集那就涉及諸如Docker的資源排程、管理等等一系列問題。目前涉及Docker叢集的三個主要的技術無外乎Swarm、Kubernetes、Mesos三種。從本文開始作者將會一一實踐這幾種主要的Docker叢集技術,話不多說,現在開始。

環境準備

  • Mac OS X 10.13.2

  • Docker 17.09.1-ce-mac42 (21090)

  • virtualbox(虛擬叢集中節點時需要)

  • boot2docker v1.8.0(在虛擬節點中起docker環境時需要)

環境搭建

節點規劃如下:

0?wx_fmt=png

我們需要4個節點(1個master + 3個slave),由於沒有真實地4臺物理機,所以下文中是靠docker-machinevirtualbox以及boot2docker來虛擬出4個獨立IP地址的帶docker環境的節點,大家注意!

環境安裝:

  • Docker環境安裝:

    Tips: 以前Mac上一般是使用boot2docker這個專門為OS X上執行 Docker 而開發的一個輕量級的虛擬主機管理工具來安裝docker,現在

    boot2docker這種安裝方式官方已經deprecated 了(當然下文中還是需要boot2docker.iso的映象來幫助我們在虛擬的節點上起docker環境),可以直接下載docker的dmg安裝包雙擊進行安裝即可

我們選擇docker CE版安裝即可,下載連結如下:
https://store.docker.com/search?type=edition&offering=community

注意:選擇官方docker dmg包安裝完成以後,docker-machine已經天然地集成於其中了,該工具在下文中建立虛擬節點時需要,它是一個可以在虛擬主機節點上安裝docker engine的工具

  • virtualbox安裝

    由於我們搭建叢集需要具備多個不同IP地址的節點,然而我們手上僅一臺電腦,所以需要藉助virtualbox來虛擬出多個不同IP地址的節點供我們使用需要

去官方下載virtualbox的dmg安裝包,雙擊安裝即可:
https://www.virtualbox.org/

  • boot2docker安裝
    Boot2Docker是一個專為Docker而設計的輕量級Linux髮型包,解決Windows或者OS X使用者不能安裝Docker的問題。Boot2Docker完全運行於記憶體中,體積小,啟動快。Boot2Docker需要執行在VirtualBox中。

我使用的是brew這個mac上的包管理器安裝的,非常方便,只需一行命令:
brew install boot2docker

除此之外我們還需要下載boot2docker.iso映象在後文中進行使用:
https://github.com/boot2docker/boot2docker/releases/tag/v17.07.0-ce
我們先把
boot2docker.iso下好後面備用

Docker Swarm叢集實驗

先建立4個虛擬節點(1個master + 3個slave)

首先要將之前下載的boot2docker.iso放到/Users/你的使用者名稱/.docker/machine/cache/目錄下,然後執行如下命令:

  1. docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso master

  2. docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave1

  3. docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave2

  4. docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave3

注意:上面若不指定boot2docker的路徑:--virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso,直接執行docker-machine create master建立節點時,可能會報No default Boot2Docker ISO found locally, downloading the latest release...這種錯誤!所以最好自己指定boot2docker.iso映象路徑

docker-machine命令建立虛擬機器過程細節如下:
0?wx_fmt=jpeg

建立完4個節點以後,可以用docker-machine ls命令檢視一下各個節點的情況,可以看到自動為其分配了獨立的IP地址:
0?wx_fmt=jpeg

ssh接入虛擬節點

開啟4個獨立的terminal終端,分別執行:

  1. docker-machine ssh master

  2. docker-machine ssh slave1

  3. docker-machine ssh slave2

  4. docker-machine ssh slave3

執行後的效果如下圖:
0?wx_fmt=jpeg

接下來在master上初始化一個docker swarm叢集

執行命令:

  1. docker swarm init --advertise-addr 192.168.99.100

效果如下:
0?wx_fmt=jpeg

上述命令執行成功後,提示中會告知使用者在slave節點上執行命令

docker swarm join --token SWMTKN-1-1uzft9zcrd5cl7eva4gr4ptgrs1gc252483ey19xfphcuxc8ta-evsmmj7b7kleh7yoezjutzuu2 192.168.99.100:2377

可以加入到該叢集中,把命令都告訴你了,你說智不智慧!

將3個slave節點加入叢集

分別去三個slave上,輸入上面提示中的命令:

  1. docker swarm join --token SWMTKN-1-1uzft9zcrd5cl7eva4gr4ptgrs1gc252483ey19xfphcuxc8ta-evsmmj7b7kleh7yoezjutzuu2 192.168.99.100:2377

執行效果如下:
0?wx_fmt=jpeg

注意:如果忘了docker swarm join 命令中的token命令的話,可以使用命令docker swarm join-token worker來get之

好,到此為止應該說docker swarm叢集的搭建工作已經完成了,那下面在這個叢集上做點實際的任務吧!

開始在master節點上建立服務

我們計劃在該docker叢集上部署高可用的nginx容器任務來作為演示:
在master節點上執行如下命令來建立名為mynginx的service,讓其有2份nginx容器副本分配到叢集中去,起在8080埠:
docker service create --replicas 2 -d -p 8080:80 --name mynginx registry.docker-cn.com/library/nginx
然後使用如下兩條命令檢視效果:

  1. docker service ls

  2. docker service ps mynginx

執行效果如下:
0?wx_fmt=jpeg

此處有兩點需要注意:

  1. 我們使用了registry.docker-cn.com/library/nginx作為加速映象,不然可能在slave上pull映象的時候timeout

  2. 注意此處建立了service之後並不是nginx容器立馬都在slave上起起來了,是需要等一段時間的(如,我等了近8分鐘),因為在slave上還要去pull nginx映象,再啟動nginx容器等,沒有那麼快

等待若干分鐘以後,我們再看效果,發現此時任務順利地分發到slave1和slave2上了:

0?wx_fmt=jpeg

分別用瀏覽器訪問:
http://192.168.99.101:8080 和 http://192.168.99.102:8080 ,會得到如下結果:

0?wx_fmt=jpeg

0?wx_fmt=jpeg

成功訪問到了slave節點中起起來的nginx服務!

此時分別去 slave1 和 slave2 上檢視容器執行情況,結果如下:
0?wx_fmt=jpeg

進一步實驗:擴容service中的任務

我們想將nginx容器平滑地擴容到3份,在master上執行:

  1. docker service scale mynginx=3

然後在master上檢視service,發現新增的一個容器任務分配到slave3上了,當然此時slave3上正在preparing:
0?wx_fmt=jpeg

等若干分鐘後在master上再次檢視service,發現slave3上的nginx容器任務成功啟動了:

0?wx_fmt=jpeg

去slave3節點上docker ps看一下,發現容器確實啟動了:
0?wx_fmt=jpeg

進一步實驗:叢集中service高可用

目前有3個執行的nginx容器保證服務的可用性,如果其中一個容器意外關閉將會是什麼情況?接下來就來模擬

我們關閉slave1上此時正在執行著的nginx容器,看服務有什麼變化:
0?wx_fmt=jpeg

此時去master節點上檢視資訊發現,被關掉的nginx被分配到master上重啟了:

0?wx_fmt=jpeg

此時我又關閉master節點上啟動的nginx容器,發現剛關閉不久後,nginx容器又重新在master上恢復了:

0?wx_fmt=jpeg

接下來我們來將slave3宕機(宕機和前文的關閉nginx容器不同,此處模仿的是物理宕機),我們在控制檯中使用docker-machine stop來模擬宕機動作:
0?wx_fmt=jpeg

此時去master上檢視service資訊發現slave3宕機以後,nginx任務又重啟與slave1上來保持高可用:

0?wx_fmt=jpeg

最後來把狠的,我們將slave1,slave2,slave3全部從叢集中斷開:
0?wx_fmt=jpeg

結果去master上檢視service資訊,發現3個容器副本全部遷移到master之上了:

0?wx_fmt=jpeg

此時在master上執行docker ps檢視容器資訊如下:執行著3個nginx容器:
0?wx_fmt=jpeg

總而言之,無論怎麼操作叢集都能保持制定數量的容器副本來實現高可用!

【乾貨】總結一下上文中的常用命令

  • 建立虛擬主機節點

    docker-machine create 虛擬主機名
  • 檢視虛擬機器節點資訊

    docker-machine ls
  • 停止虛擬主機節點

    docker-machine stop 虛擬主機名
  • 刪除虛擬主機節點

    docker-machine rm 虛擬主機名
  • 初始化docker swarm叢集

    docker swarm init --advertise-addr masterIP地址
  • slave節點加入叢集

    docker swarm join --token [token][masterIP]:[master的埠]
  • slave節點主動離開叢集

    docker swarm leave
  • 在master上獲取加入叢集的token

    docker swarm join-
                
               

    相關推薦

    乾貨Docker Swarm叢集初探

    點選上方“中興開發者社群”,關注我們每天讀一篇一線開發者原創好文作者簡介作者王帥是中興通訊的一名

    grafana+influxdb+cadvisor監控docker-swarm叢集

    首先需要自己安裝docker以及搭建好swarm叢集,太簡單就不在這裡說了 1:docker-compose.yaml編寫,包含grafana+influxdb+cadvisor編排。如下: version: ‘3’ services: influx: image: influx

    Docker Swarm叢集中部署Traefik負載均衡器

       一、建立單節點的Docker Swarm叢集 docker swarm init   二、在Swarm叢集中建立一個網路 docker network create --driver=overlay traefik --attachable  

    使用docker swarm叢集心得

    本片關於使用docker swarm 叢集心得,也是一些經驗吧!過程描述可能簡單! 根據一些公司使用經歷接收一下問題並針對問題作出應對策略 1、docker swarm叢集 主節點數必須是單數,也就是說主節點數控制一般是1、3、5、7.......     &nb

    Docker(二十)-Docker Swarm叢集部署

    介紹 Swarm 在 Docker 1.12 版本之前屬於一個獨立的專案,在 Docker 1.12 版本釋出之後,該專案合併到了 Docker 中,成為 Docker 的一個子命令。目前,Swarm 是 Docker 社群提供的唯一一個原生支援 Docker 叢集管理的工具。它可以把多個 Docker 主

    docker swarm 叢集的簡單實現

    1、系統環境:三臺CENTOS7的機器 192.168.156.75 管理節點 192.168.156.72 工作節點 192.168.156.77 工作節點 2、分別在三臺機器安裝docker yum install docker-io -y docke

    Docker Swarm 叢集部署

    介紹      Swarm 作為Docker 三劍客之一,於2014年提出,自 v1.12.3 以來, docker swarm 成為 docker 引擎內建的服務。它和谷歌的 K8s 產生了直接競爭。很難說哪個好,對於熟悉 docker 容器的人來說,docker s

    Docker swarm叢集實現負載均衡

    實驗環境: server1:172.25.40.11 swarm server2:172.25.40.12 node server3:172.25.40.13 node 搭建叢集 【server1】 [[email protected] ~]#

    龍芯平臺搭建Docker Swarm叢集

    http://ask.loongnix.org/?/article/91   本教程將指導完成如下工作: 初始化一個Docker swarm叢集; 新增節點到swarm; 部署swarm服務; 管理swarm。 準備工作: 三臺Linu

    Docker swarm叢集搭建教程

    一、什麼是Swarm   Swarm這個專案名稱特別貼切。在Wiki的解釋中,Swarm behavior是指動物的群集行為。比如我們常見的蜂群,魚群,秋天往南飛的雁群都可以稱作Swarm behavior。 Swarm專案正是這樣,通過把多個Docker Engine聚集在一

    Docker-swarm叢集搭建及visualize監控的相關配置

    初識Swarm Swarm 是 Docker 公司在 2014 年 12 月初發布的一套較為簡單的工具,用來管理 Docker 集 群,它將一群 Docker 宿主機變成一個單一的,虛擬的主機。Swarm 使用標準的 Docker API 介

    docker swarm叢集搭建以及使用滾動更新

    基礎環境,三臺虛擬機器 172.17.3.70 172.17.3.71 172.17.3.72 系統配置:centos 7,關閉selinux 需要優化的基礎配置: [[email protected] ~]# vim /etc/rc.local

    將Java EE應用程式部署到Docker Swarm叢集

    ​ 什麼是Docker Swarm? 簡單來說,Swarm Manager是一個預先設定好的Docker主機,並且是所有管理的唯一一點。其他Docker主機被定義為節點,並使用TCP與Manager進行通訊。預設情況下,Swarm會使用託管的 基於

    Docker Swarm叢集實踐——部署篇

    最新訊息 Docker在上週的DockerCon技術大會上釋出了1.12版核心產品Docker Engine,最大的新特性是Docker Swarm已經被整合到了Docker Engine裡面而不再是一個單獨的工具了,這樣就可以更容易的把多個Docker主機組合成一整個規模

    docker 1.12 版本 docker swarm 叢集

       docker 1.12 版本 的新特性 (1)docker swarm:叢集管理,子命令有init, join, leave, update (2)docker service:服務建立,子命令有create, inspect, update, remove, tasks (3)docker no

    搭建Docker Swarm叢集實戰(一)(服務發現使用consul)

    注意: docker在版本1.12之後,已經將swarm的部分整合在docker裡面了,所以也就不需要依賴第三方的東西了。 所以如果不是為了有趣瞭解一下的話,請直接轉到本系列的第三篇開始=》搭建Docker Swarm叢集實戰(三)(swarm

    搭建Docker Swarm叢集實戰(三)(swarm mode)

    前言 docker在1.12版本之後,把swarm的功能內建到docker engine本身,因此之前使用consul等第三方服務發現和鍵值服務的方法就可以作古了。 這篇就是用docker自帶的swarm mode來進行swarm的叢集搭建。 這篇實操的主

    7.2docker官網入門-Docker Swarm 叢集(下)---最重要

    Docker Swarm 叢集 (1)容器與應用: 講述 centos docker的安裝,倉庫、映象、容器、服務的概念, dockerfile,compose 檔案,容器管理圖形介面,以單機操作為主線。 (2)Docker Swarm 叢集:講述叢集(cluster)m

    docker swarm 叢集搭建

    準備好多臺已經安裝好docker的機器,沒有安裝好docker的可以參考我的另一篇關於docker安裝文件https://my.o

    【故障公告】docker swarm 叢集問題引發的故障

    我們的生產環境部署了 2 個 docker swarm 叢集,叢集 swarm-a 用於專門跑部落格站點,叢集 swarm-b 用於跑其他站點,manager 節點用了阿里雲包月伺服器,worker 節點用了阿里雲搶佔式例項。 今天 11:03 收到阿里雲的簡訊通知“您的搶佔式例項:例項ID(例項