1. 程式人生 > >Docker Swarm叢集實踐——部署篇

Docker Swarm叢集實踐——部署篇

最新訊息

Docker在上週的DockerCon技術大會上釋出了1.12版核心產品Docker Engine,最大的新特性是Docker Swarm已經被整合到了Docker Engine裡面而不再是一個單獨的工具了,這樣就可以更容易的把多個Docker主機組合成一整個規模更大可靠性更高的邏輯單元。Docker的掌舵者 Adrian Mouat相信這種新的叢集模式可以大大增強Docker在相關領域的競爭力。

把Docker Swarm整合進Docker Engine是一個重大改進,但它也只是一個附加功能,你可以只在需要的時候才使用它。你可以用和以前一樣的方式來安裝、執行和升級Docker 1.12,而且它也對已有的容器映象和工具向後相容。


以上是關於Swarm的最新發展,你可以深切的感受到開源力量對一個技術的快速迭代,相比較一個公司使用激勵機制提高員工的積極性,開源的思想讓那些有共同理想的技術天才共同協作,為科技的發展提供動力。一點感慨而已!

當然,我們先了解一下現在Swarm的狀況,對學習未來的Swarm還是很有幫助的。

Swarm 簡介

Swarm是Docker公司在2014年12月初新發布的容器管理工具。和Swarm一起釋出的Docker管理工具還有Machine以及Compose。Swarm是一套較為簡單的工具,用以管理Docker叢集,使得Docker叢集暴露給使用者時相當於一個虛擬的整體。Swarm使用標準的Docker API介面作為其前端訪問入口,換言之,各種形式的Docker Client均可以直接與Swarm通訊



Swarm架構
Swarm作為一個管理Docker叢集的工具,首先需要將其部署起來,可以單獨將Swarm部署於一個節點。另外,自然需要一個Docker叢集,叢集上每一個節點均安裝有Docker。具體的Swarm架構圖可以參照下圖:


Swarm架構中最主要的處理部分自然是Swarm節點,Swarm管理的物件自然是Docker Cluster,Docker Cluster由多個Docker Node組成,而負責給Swarm傳送請求的是Docker Client。

Swarm deamon只是一個排程器(Scheduler)加路由器(router),Swarm自己不執行容器,它只是接受docker客戶端傳送過來的請求,排程適合的節點來執行容器,這意味著,即使Swarm由於某些原因掛掉了,叢集中的節點也會照常執行,當Swarm重新恢復執行之後,它會收集重建叢集資訊。

Swarm叢集部署

部署架構如下


我們有三臺伺服器,132機器作為Swarm Server伺服器,其他伺服器作為Docker叢集的子節點。

1、132機器上下載Swarm映象

docker pull swarm

2、在使用Swarm進行叢集管理之前,需要先把準備加入叢集的所有的節點的docker deamon的監聽埠修改為0.0.0.0:2375,修改所有參與Swarm叢集的伺服器的/etc/default/docker,對映容器埠號.

DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
重啟docker 服務

3、在132機器上申請Swarm的token

[email protected]:~# docker run --rm swarm create
88b70a0603a97f3e51be1d83f471a1df
該token是其他機器加入叢集的憑證,需要記錄。

原則上Swarm Server132機器是無需執行容器的,當然,我們為了保證叢集數量儘可能多,將132機器也加入進來

[email protected]:~# docker run -d swarm join -addr=192.168.12.132:2375 token://88b70a0603a97f3e51be1d83f471a1df
012b3744d4554e7db148b3fb35827e18fec9d12029e7e276707b2eb244dbb47b
Swarm的swarm join命令用於將Docker Node新增至Swarm管理的Docker叢集中。從這點也可以看出swarm join命令的執行位於Docker Node,因此在Docker Node上執行該命令,首先需要在Docker Node上安裝Swarm,由於該Swarm只會執行swarm join命令,故可以將其當成Docker Node上用於註冊的agent模組。功能而言,swarm join可以認為是完成Docker Node在Swarm節點處的註冊(register)工作,以便Swarm在執行swarm manage時可以發現該Docker Node。

4、啟動Swarm Manager

Swarm中swarm manage是最為重要的管理命令。一旦swarm manage命令在Swarm節點上被觸發,則說明使用者需要swarm開始管理Docker叢集。從執行流程的角度來講,swarm經歷的階段主要有兩點:啟動swarm、接收並處理Docker叢集管理請求。

[email protected]:~# docker run -p 2376:2375 -d swarm manage token://88b70a0603a97f3e51be1d83f471a1df
62ad831e134a1f2c61385fae4684396b0375deef07c9137cbb80543193ea2e4a

注意的是:在這條命令中,第一:要以daemon的形式執行swarm;第二:埠對映:2376可以更換成任何一個本機沒有佔用的埠,一定不能是2375,否則就會出問題。

檢視一下當前的Swarm參與叢集的機器列表
[email protected]:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df
192.168.12.132:2375

可見當前只有132機器加入進來了。

Swarm中的swarm list命令用以列舉Docker叢集中的Docker Node。Docker Node的資訊均來源於Swarm節點上註冊的Docker Node。而一個Docker Node在Swarm節點上註冊,僅僅是註冊了Docker Node的IP地址以及Docker監聽的埠號。

5、同理,我們將133,134機器新增進來

在133機器執行

[email protected]:~#  docker run -d swarm join -addr=192.168.12.133:2375 token://88b70a0603a97f3e51be1d83f471a1df
e6244ba8f845d87bd9398f9e2d98a0757050bbd8fe1b4d39a827dec84c0bc541

在132機器檢視節點列表

[email protected]:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df
192.168.12.133:2375
192.168.12.132:2375

在134機器執行

[email protected]:~#  docker run -d swarm join -addr=192.168.12.134:2375 token://88b70a0603a97f3e51be1d83f471a1df
c2cf9a779a3b4566f5c199c9b1174a57e87cf800a5b4c37f0545b3af9c993478

在132機器檢視節點列表

[email protected]:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df
192.168.12.134:2375
192.168.12.133:2375
192.168.12.132:2375

檢視完節點列表,我們也看到了相關docker伺服器已經加入到了叢集中,但是我們需要查詢一下叢集的節點資訊

執行docker -H 192.168.12.132:2376 info


我們從中發現一個問題,所含的三個叢集子節點只有一個狀態是Healthy,其他都是pending狀態,我們也看到Error 資訊:Error: ID duplicated.

這是因為,我在本機的虛擬機器來實踐,我的所有機器都是通過同一個機器進行復制,所以導致ID都是一樣,因此報錯,在生產環境應該不會出現該問題。當然,這個問題也可以解決,我們只需要將/etc/docker.key.json檔案直接刪除掉,然後重啟一下,系統會新生成一個隨機的key.json檔案,也就解決該問題了。

重新執行該命令

[email protected]:~# docker -H 192.168.12.132:2376 info
Containers: 23
 Running: 6
 Paused: 0
 Stopped: 17
Images: 23
Server Version: swarm/1.2.3
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 3
 controller: 192.168.12.132:2375
  └ ID: CTCC:NH3C:3LID:NMV6:IPEZ:BEXX:GQEH:74GY:RMS6:4MCW:NWOT:MG5Q
  └ Status: Healthy
  └ Containers: 12
  └ Reserved CPUs: 0 / 2
  └ Reserved Memory: 1 GiB / 2.046 GiB
  └ Labels: executiondriver=, kernelversion=3.13.0-92-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs
  └ UpdatedAt: 2016-07-10T07:34:54Z
  └ ServerVersion: 1.11.2
 docker1: 192.168.12.133:2375
  └ ID: MBI4:BY3Z:FOJN:XDLB:6I24:JYKJ:QQKY:MWBS:ZTRI:ATM6:QTDO:7XRR
  └ Status: Healthy
  └ Containers: 6
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.012 GiB
  └ Labels: executiondriver=, kernelversion=3.13.0-24-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs
  └ UpdatedAt: 2016-07-10T07:34:31Z
  └ ServerVersion: 1.11.2
 docker2: 192.168.12.134:2375
  └ ID: ZU2Y:GUAK:CMAK:NDMG:HKII:JY3R:7FLM:VM74:5FNJ:X6ON:ZDKM:LQI7
  └ Status: Healthy
  └ Containers: 5
  └ Reserved CPUs: 0 / 2
  └ Reserved Memory: 0 B / 2.045 GiB
  └ Labels: executiondriver=, kernelversion=3.13.0-24-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs
  └ UpdatedAt: 2016-07-10T07:34:31Z
  └ ServerVersion: 1.11.2
Plugins:
 Volume:
 Network:
Kernel Version: 3.13.0-92-generic
Operating System: linux
Architecture: amd64
CPUs: 5
Total Memory: 5.103 GiB
Name: c8714a5864d1
Docker Root Dir:
Debug mode (client): false
Debug mode (server): false
WARNING: No kernel memory limit support

至此,Swarm叢集部署完畢!

還記得上次我們在介紹SuperMap iCloudManager 8C 新特性,已經支援Docker了,當時只是在Docker單機進行的操作。

現如今,我們已經搭建了Swarm叢集,我們就在叢集環境下試用一下iCloudManager。

根據上述描述我們可以看到,三臺Docker叢集總共的計算資源(2CPU+2G RAM,1CPU+1G RAM,2CPU+2G RAM),總共5CPU+5G RAM.

首先,我們在配置初始化的時候,需要輸入Swarm Manager的IP和埠號(2376)而不是2375,因為2375代表132機器的資訊,2376代表叢集的整體資訊。


同時,我們可以可以在首頁看到整體的資源資訊


我們建立個新的iServer例項後可以看到,已經建立在132機器上了。

[email protected]:~# docker ps -a
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                    PORTS                                                                                                       NAMES
3d73f706d1ba        322cacd8b1ca                  "/bin/sh -c /opt/run."   15 minutes ago      Up 14 minutes             0.0.0.0:51237->809                                         0/tcp                                            sm_iserver-51237
c38dd3d3e671        322cacd8b1ca                  "/bin/sh -c /opt/run."   16 minutes ago      Up 16 minutes             0.0.0.0:53796->809                                         0/tcp                                            sm_iserver-53796
c8714a5864d1        swarm                         "/swarm manage token:"   55 minutes ago      Up 55 minutes             0.0.0.0:2376->2375                                         /tcp                                             sick_lichterman
f099c42cc02f        swarm                         "/swarm join -addr=19"   55 minutes ago      Up 55 minutes             2375/tcp                                                                                                    evil_lovelace
201248c1e82a        swarm                         "/swarm manage token:"   21 hours ago        Exited (2) 20 hours ago                                                                                                               hopeful_albattani
cdac07b03439        swarm                         "/swarm join -addr=19"   21 hours ago        Exited (2) 20 hours ago                                                                                                               focused_kirch
e8295720300b        swarm                         "/swarm manage token:"   39 hours ago        Exited (2) 38 hours ago                                                                                                               adoring_mayer
dd6e3154ea6c        supermap/icloudmanager:c802   "/bin/sh -c /etc/iclo"   41 hours ago        Up 39 minutes             0.0.0.0:8080->8080                                         /tcp                                             root_icloudmanager_1
6b22dd275262        zabbix/zabbix-3.0:3.0.0       "/config/bootstrap.sh"   41 hours ago        Up 39 minutes             0.0.0.0:80->80/tcp                                         , 0.0.0.0:10051->10051/tcp, 162/udp, 10052/tcp   root_zabbix-server_1
d3c0d9431c28        zabbix/zabbix-db-mariadb      "/run.sh"                41 hours ago        Up 39 minutes             0.0.0.0:3306->3306                                         /tcp                                             root_zabbix-db_1
012b3744d455        swarm                         "/swarm join -addr=19"   42 hours ago        Exited (2) 38 hours ago                                                                                                               condescending_dijkstra
47b06d6ef5e1        registry:2.3.0                "/bin/registry /etc/d"   46 hours ago        Up 57 minutes             0.0.0.0:5000->5000                                         /tcp                                             registry

注意:通過Swarm 叢集儘量與Docker Registry進行配合使用,也就是iCM的映象使用倉庫裡面的映象,然後通過iCM建立例項的時候,就可以快速pull過來。

接下來我們之間通過命令列來建立容器例項,

執行如下命令:docker -H 192.168.12.132:2376  run -id --name ubuntu  ubuntu:14.04

[email protected]:~# docker -H 192.168.12.132:2376  run -id --name ubuntu  ubuntu:14.04
850f4f774623f970a96d10232899cf94761ab0770b98699cd32bdddf88fa4c6f
我們在docker2機器上看到已經建立的例項
[email protected]:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
850f4f774623        ubuntu:14.04        "/bin/bash"              2 minutes ago       Up 2 minutes                                       ubuntu
ed47f31a032f        swarm               "/swarm join -addr=19"   57 minutes ago      Up 57 minutes                  2375/tcp            jolly_golick
982c4c9a615b        swarm               "/swarm join -addr=19"   About an hour ago   Exited (2) About an hour ago                       jolly_mcclintock
3095e60cb60f        swarm               "/swarm join -addr=19"   20 hours ago        Exited (2) 20 hours ago                            adoring_cray
56b828a44daa        swarm               "/swarm join -addr=19"   21 hours ago        Exited (2) 20 hours ago                            high_meitner
c2cf9a779a3b        swarm               "/swarm join -addr=19"   31 hours ago        Exited (2) 28 hours ago                            modest_newton
我們繼續建立同樣的例項ubuntu1
[email protected]:~# docker -H 192.168.12.132:2376  run -id --name ubuntu1  ubuntu:14.04
e791527c382c454b99f70aeb732b154c500f5586eff2ba124f472e26ec8e3a69
我們看到ubuntu1已經建立到了docker1機器上了
[email protected]:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
e791527c382c        ubuntu:14.04        "/bin/bash"              20 seconds ago      Up 19 seconds                                 ubuntu1
8f186a1bc3f4        swarm               "/swarm join -addr=19"   57 minutes ago      Up 57 minutes             2375/tcp            kickass_archimedes
e636fb8a6084        swarm               "/swarm join -addr=19"   21 hours ago        Exited (2) 20 hours ago                       clever_raman
1a5e6b6eb667        swarm               "/swarm join -addr=19"   23 hours ago        Exited (2) 23 hours ago                       goofy_varahamihira
e6244ba8f845        swarm               "/swarm join -addr=19"   42 hours ago        Exited (2) 39 hours ago                       suspicious_sinoussi
07438a67cc7a        swarm               "/swarm join -addr=19"   42 hours ago        Exited (2) 39 hours ago                       admiring_leavitt

如果我們繼續建立ubuntu例項,會報已經有同名的錯誤
[email protected]:~# docker -H 192.168.12.132:2376  run -id --name ubuntu  ubuntu:14.04
docker: Error response from daemon: Conflict: The name ubuntu is already assigned. You have to delete (or rename) that container to be able to assign ubuntu to a container again..
See 'docker run --help'.

但是這個錯誤應該跟排程有關係,同一叢集同一個節點內不應該有同樣的例項名,但是同一叢集不同的節點應該可以有同樣的例項名,接下來我們就看看關於Swarm叢集的排程以及過濾機制

接下來我們就針對Docker Swarm的叢集進行操作,包括SuperMap iCloudManager在Swarm叢集的操作。

相關推薦

Docker Swarm叢集實踐——部署

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

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

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

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

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

Docker Swarm 叢集部署

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

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

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

Kubernetes管理Docker叢集部署

什麼是Kubernetes? Kubernetes是Google開源的容器叢集管理系統,實現基於Docker構建容器,利用Kubernetes能很方面管理多臺Docker主機中的容器。 主要功能如下: 1)將多臺Docker主機抽象為一個資源,以叢集方式管理容器,

Docker Swarm 叢集環境搭建及彈性服務部署

  上一篇文章《Docker Swarm 叢集管理利器核心概念掃盲》中我們把 Swarm 重要的概念性知識給大家講解了一波,理論完事就該實戰了,這篇文章帶大家從零開始,搭建 Docker Swarm 叢集環境,並通過 Swarm 實現服務的彈性部署,滾動更新服務及回滾服務等功能。    ## 叢集搭建

docker swarm集群部署

docker swarm docker swarm 集群構建:swarm 在docker 1.12 版本後內置#h官方文檔tps://docs.docker.com/engine/swarm/#feature-highlights系統環境: centos7.3 docker17.061、初始化ma

雲計算之路-阿裏雲上:針對 docker swarm 故障的部署調整以及應急措施

通過 pos https 服務 note 17.1 阿裏雲 應用 應急 針對上周 docker swarm 集群的頻繁故障(詳見故障一 、故障二、故障三),我們今天對 docker swarm 集群的部署進行了如下調整。 將 docker engine 由 &ldquo

Docker 源碼架構部署(一)

docker一. Docker入門簡介Docker是Docker公司開源的一個基於輕量級虛擬化技術的容器引擎項目,整個項目基於Go語言開發,並遵從Apache 2.0協議。目前,Docker可以在容器內部快速自動化部署應用,並可以通過內核虛擬化技術(namespaces及cgroups等)來提供容器的資源隔離

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

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

使用docker swarm叢集心得

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

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叢集實現負載均衡

實驗環境: 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 和compose部署服務,解決跨主機網路問題和ip不固定問題(二)

一 docker 版本1.13及以上,compose版本1.11及以上。docker的搭建和執行compose參考官方文件完成二  docker swarm 和compose 簡介Docker宣佈在1.12版的引擎中內建編排能力,也就是 Swarm Mode,在容器之上引入了

Docker swarm叢集搭建教程

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

docker swarm 和compose部署服務,解決跨主機網路問題和ip不固定問題(一)

一  要求: docker版本13以上;compose版本11以上;關閉防火牆和selinux二  composev3版本加入了很多功能,現在我肯可以很方便的結合docker swarm 和compose來完成不同主機之間的通訊問題三 準別2臺虛機,安裝docker ,配置d

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