1. 程式人生 > >Docker Swarm群集

Docker Swarm群集

swarm 群集

Docker Swarm 是什麽?

Docker Swarm是一個用於創建Docker主機(運行Docker守護進程的服務器)集群的工具,使用Swarm操作集群,會使用戶感覺就像是在一臺主機上進行操作

docker1.12集成了swarmkit, 使你可以不用安裝額外的軟件包, 使用簡單的命令啟動創建docker swarm集群。

如果你在運行 Docker 1.12時,你就可以原生創建一個 Swarm 集群 .

集成了swarm集群的安全特性, 集成了K-V存儲, 你現在不需要額外部署etcd或者consul

Docker1.12版本中,一個大的功能點是swarm集群(基於swarmkit項目),通過

Docker命令可以直接實現docker-engine相互發現,並組建成為一個容器集群

SwarmKit將節點分為兩類:

工作節點(Worker:負責通過執行器運行任務。SwarmKit的默認執行器為Docker容器執行器(Docker Container Executor)。

  (1)內建分布式存儲,不要額外的數據庫

  (2)支持Rolling update

  (3容器高可用

  (4)通過TLS保證了節點之間通訊的安全

管理節點(Manager:負責接收和響應用戶請求,將集群狀態調節到最終狀態。在SwarmKit中,用戶可以動態調整節點的角色,即在ManagerWorker之間轉換。

如下圖所示,這是一個典型的

master-slave的架構。每個節點都是運行著Docker EngineDocker主機。一些節點有更高的權限,被稱為Manager。下面的節點是worker節點,接收來自manager組的任務指示。

技術分享


部署docker1.12 Swarm

實驗環境:

這裏選擇三臺主機運行Swarm,依次為:

node1  192.168.100.5

node2  192.168.100.6

node3  192.168.100.7

基本環境配置

3臺主機確保時間一致 ntp

3臺主機均關閉selinux,開啟路由轉發。 /ect/sysctl.conf

[[email protected] ~]# sysctl -p
net.ipv4.ip_forward = 1

4關閉selinux

[[email protected] ~]# setenforce 0

5 3臺主機修改/etc/hosts文件

技術分享

Ping 連通性

技術分享

開啟宿主機之間的端口

TCP端口2377集群管理端口

TCPUDP端口7946節點之間通訊端口

TCPUDP端口4789 overlay網絡通訊端口

技術分享

配置所有節點密鑰登錄.

配置所下節點密鑰互信, node1可以免密碼登錄各節點,只在node1上執行:

生成sshkey

[[email protected] ~]# ssh-keygen

發布sshkey到各個節點 ssh-copy-id node2 3 1

技術分享

測試密鑰登錄

技術分享

安裝docker 1.12 yum報錯 rm -rf /var/rum/yum.pid 刪除pid 3臺都需要安裝

[[email protected] /]# yum -y install docker
[[email protected] /]# systemctl start docker

docker1.12 Swarm 模式簡介

Docker Engine 1.12 集成了Swarm集群工具.

主要使用三個新的命令行工具創建一個swarm集群:

docker swarm 開啟swarm模式; 加入Swarm集群; 配置集群參數

docker node 查詢集群節點信息; 提升/移除一個管理節點; 管理swarm節點主機

docker service 創建管理 service

可以查看docker --help

創建 Swarm集群

node1上初始化swram集群:

註意 你只需要在一個node1上初始化swarm集群, 其他node加入這個集群就行了, 所以以下命令只需要在node1上運行.

[[email protected] /]# docker swarm init --advertise-addr 192.168.100.5

技術分享

1) 查看swarm集群node列表

[[email protected] /]# docker node ls

技術分享

我們的其他節點服務器,worker角色加入swarm集群需要登錄到服務器運行如下命令:

[[email protected] /]# docker swarm  join-token  worker

1) 其他節點以worker加入集群使用上面查看到的命令加入集群(node2、node3上)

技術分享

1) 查看集群節點情況,驗證加入與否

技術分享

1) 提升node2為管理

[[email protected] /]# docker node promote node2

技術分享

docker swarm:集群管理,子命令主要有下面幾個。

docker swarm init命令用於初始化一個集群

dockerswarm join命令用於加入一個現有集群

dockerswarm leave命令由於離開集群

有了Docker Swarm集群我們如何把我們的應用跑在Swarm集群上呢?

很簡單, 基本上原來我們使用docker run的命令創建容器, 把前面替換成docker service create就行了.

建議搭建一個registry,為所的docker主機提供鏡像下載,否則你需要在每個docker主機本地存在容器鏡像。

所以搭建一個私有倉庫,由私有倉庫提供所需要的鏡像,

本實驗環境中用node1同時作為registry

拉取本地私有倉庫registry查看registry鏡像技術分享

上傳registry2.tar

技術分享

運行容器(端口映射、隨docker啟動時容器亦啟動、路徑映射、名字)

[[email protected] src]# mkdir -p /opt/data/registry
[[email protected] src]# docker run -d -p 5000:5000 --restart=always -v /opt/data/registry/:/var/lib/registry --name registry2 registry:2

技術分享

查看私有倉庫(可以看到倉庫為空)

[[email protected] src]# curl 192.168.100.5:5000/v2/_catalog

1. 所有節點指向registry服務器:

停止docker服務

[[email protected] src]# vim /usr/lib/systemd/system/docker.service

技術分享

[[email protected] src]# systemctl daemon-reload 
[[email protected] src]# systemctl start docker

1. 推送鏡像並驗證

node2上傳鏡像

[[email protected] src]# docker load < centos7.tar

node2配置Dockerfile

[[email protected] apache]# vim dockerfile 
FROM docker.io/centos:latest
RUN yum -y install httpd net-tools
RUN sed ‘s/#ServerName /ServerName /g‘ -i /etc/httpd/conf/httpd.conf
EXPOSE 80
CMD  ["/usr/sbin/httpd","-DFOREGROUND"]

node2構建

[[email protected] apache]# docker build -t 192.168.100.5:5000/centos:httpd .

node2上傳鏡像到registry

查看registry中鏡像

[[email protected] apache]# curl 192.168.100.5:5000/v2/_catalog

node3、node1測試從registry下載鏡像 nond3 測試

技術分享

技術分享

overlay網絡

解決了鏡像構建問題, 為了讓應用跑在swram集群,我們還需要解決容器間的網絡訪問問題.

單臺服務器的時候我們應用所有的容器都跑在一臺主機上, 所以容器之間的網絡是互通的. 現在我們的集群有3臺主機, 所以docker應用的服務會分布在這3臺主機上.

如何保證不同主機上的容器網絡互通呢?

swarm集群已經幫我們解決了這個問題了,就是只用overlay network.

docker 1.12以前, swarm集群需要一個額外的key-value存儲(consul, etcd). 來同步網絡配置, 保證所有容器在同一個網段中.

docker 1.12已經內置了這個存儲, 集成了overlay networks的支持.

下面我們演示下如何創建一個 overlay network:

註:swarm上默認已有一個名為ingressoverlay 網絡, 可以直接使用, 但本文會創建一個新的

為我們的docker應用創建一個名為dockercoinsoverlay network

1. node2上創建overlay network

[[email protected] apache]# docker network create --driver overlay dockercoins
[[email protected] apache]# docker network ls

技術分享

1. node1上查看(worker節點看不到)

技術分享

註:一旦新的任務被指定給這個節點,Overlay網絡就會被按需創建。

swarm集群上運行docker應用

概念解釋:service

Docker1.12 swarm引入了服務的概念,一個服務由多個任務組成,一個任務即一個運行的容器。

服務包括兩種類型:

復制服務(replicated services):類似 k8s 中復制集的概念,保持一定數量的相同任務在集群中運行;

全局服務(global services):類似 k8s daemon 的概念,每個工作節點上運行一個。

發布服務

manager上執行如下命令:

下面我們可以使用之前push到本地鏡像倉庫的鏡像啟動服務, centos:http為例:

復制服務類型運行服務

manager上執行如下命令:

[[email protected] src]# docker service create --replicas 1 --network dockercoins --name web1 -p 8000:80 192.168.100.5:5000/centos:httpd
efd1jxmt3pthvwscgkt1n1hj6

技術分享

瀏覽器驗證:(三個節點ip:8000都可以訪問)

技術分享

如運行web2,倆個容器運行服務:

[[email protected] src]# docker service create --replicas 2 --network dockercoins --name web2 -p 8080:80 192.168.100.5:5000/centos:httpd
f2wh08sgy2q2wp5s63oczxk1t

技術分享

從上圖可以看到web2名稱的service2個副本分別運行在node2node3節點上

1. 以全局服務類型運行服務:

技術分享

從下圖可以看到服務web4在每個節點上都運行一個

技術分享

下面我們擴展舊的服務,從下圖可以看到web1 service目前只有一個副本

[[email protected] /]# docker service scale web1=3

技術分享

技術分享

可以看到web1服務擴展到3個副本數。

3 縮減已有的服務副本數:

[[email protected] /]# docker service scale web1=2

技術分享

可以看到web1服務縮減到2個副本數。

Swarm節點是自組織(self-organizing)和自修復(self-healing)的,什麽意思?只要有節點或容器宕掉,swarm engine就會嘗試修復,下面我們來具體看一下

自修復(self-healing

技術分享

可以看到:3個節點,運行8個任務(容器)。包含一個registry容器。

技術分享

我們模擬node3上的容器都宕掉或部分宕掉

[[email protected] /]# docker stop $(docker ps -aq)

技術分享

結果:

技術分享

可以看到docker會在相同節點上啟動1個不同ID的容器。

Self-Organizing

現在我們讓node3整個宕掉,node3上的容器會自動在其它節點上啟動。

manager節點上執行docker server ps服務名

[[email protected] /]# systemctl stop docker

結果: node1 上

技術分享

node2

技術分享

可以看到node3上的web2.2在node2上啟動了;至於node3上的web4.0則因為是全局服務類型,故而node3停止服務後,會停掉。


本文出自 “chaixinwang” 博客,請務必保留此出處http://chaixinwang.blog.51cto.com/13052229/1962325

Docker Swarm群集