Docker Swarm羣集

Docker Swarm 是什麼?node

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

docker1.12集成了swarmkit, 使你能夠不用安裝額外的軟件包, 使用簡單的命令啓動建立docker swarm集羣。git

若是你在運行 Docker 1.12時,你就能夠原生建立一個 Swarm 集羣 .github

集成了swarm集羣的安全特性, 集成了K-V存儲, 你如今不須要額外部署etcd或者consulweb

Docker1.12版本中,一個大的功能點是swarm集羣(基於swarmkit項目),經過Docker命令能夠直接實現docker-engine相互發現,並組建成爲一個容器集羣docker

SwarmKit將節點分爲兩類:數據庫

工做節點(Worker:負責經過執行器運行任務。SwarmKit的默認執行器爲Docker容器執行器(Docker Container Executor)。apache

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

  (2)支持Rolling update centos

  (3容器高可用

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

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

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

wKiom1mrwjCjvOMvAADAHVKu1T4591.png-wh_50


部署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

[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1

4關閉selinux

[root@localhost ~]# setenforce 0

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

wKioL1mrwk6Tw4RBAAAJvJ4uGWE420.png-wh_50

Ping  連通性

wKiom1mrwrryIT9wAAAV0-_-RLE154.png-wh_50

開啓宿主機之間的端口 

TCP端口2377集羣管理端口

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

TCPUDP端口4789 overlay網絡通信端口

wKioL1mrwrDik1x-AAAycdfHzk4610.png-wh_50

配置全部節點密鑰登陸.

配置所下節點密鑰互信, node1能夠免密碼登陸各節點,只在node1上執行:

生成sshkey

[root@localhost ~]# ssh-keygen

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

wKiom1mrwujBTAq7AAArrFBozmQ320.png-wh_50

測試密鑰登陸

wKioL1mrwtvAwrKtAAAjRjRvsaM654.png-wh_50

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

[root@localhost /]# yum -y install docker
[root@localhost /]# 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上運行.

[root@localhost /]# docker swarm init --advertise-addr 192.168.100.5

wKiom1mrwyiyzxZtAAAjufiqens222.png-wh_50

1) 查看swarm集羣node列表 

[root@localhost /]# docker node ls

wKioL1mrwzHAj5bhAAAQFQ193l4292.png-wh_50

咱們的其餘節點服務器,worker角色加入swarm集羣須要登陸到服務器運行以下命令:

[root@localhost /]# docker swarm  join-token  worker

1) 其餘節點以worker加入集羣使用上面查看到的命令加入集羣(node二、node3上)

wKiom1mrw4nwYwpzAAAYnhZ4tFI360.png-wh_50

1) 查看集羣節點狀況,驗證加入與否

wKioL1mrw3_wziR8AAAXmNDSaYE922.png-wh_50

1) 提高node2爲管理 

[root@node1 /]# docker node promote node2

wKiom1mrw7vRpdP3AAAYJieaYyQ176.png-wh_50

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

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

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

dockerswarm leave命令因爲離開集羣

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

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

建議搭建一個registry,爲所的docker主機提供鏡像下載,不然你須要在每一個docker主機本地存在容器鏡像。

因此搭建一個私有倉庫,由私有倉庫提供所須要的鏡像,

本實驗環境中用node1同時做爲registry

拉取本地私有倉庫registry查看registry鏡像wKioL1mrw9nBDK62AAAX33zcGpI317.png-wh_50

上傳registry2.tar

wKiom1mrw9bSFZcWAAAgjeklmR4979.png-wh_50

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

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

wKioL1mrw-nQ3Xx0AAAX33zcGpI085.png-wh_50

查看私有倉庫(能夠看到倉庫爲空)

[root@node1 src]# curl 192.168.100.5:5000/v2/_catalog

1. 全部節點指向registry服務器:

中止docker服務

[root@node1 src]# vim /usr/lib/systemd/system/docker.service

wKioL1mrxNPg_HtPAAAW-TKPj40708.png-wh_50

[root@node1 src]# systemctl daemon-reload 
[root@node1 src]# systemctl start docker

1. 推送鏡像並驗證

node2上傳鏡像

[root@node2 src]# docker load < centos7.tar

node2配置Dockerfile

[root@node2 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構建

[root@node2 apache]# docker build -t 192.168.100.5:5000/centos:httpd .

node2上傳鏡像到registry

查看registry中鏡像

[root@node2 apache]# curl 192.168.100.5:5000/v2/_catalog

node三、node1測試從registry下載鏡像  nond3 測試

wKiom1mrxVehKZ3VAAAivWU--P4490.png-wh_50

wKioL1mrxTyQ6TKMAAARo9ikvdA304.png-wh_50

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

[root@node2 apache]# docker network create --driver overlay dockercoins
[root@node2 apache]# docker network ls

wKiom1mrxbKjKKl9AAAnWiyX3Fk581.png-wh_50

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

wKioL1mrxanDPn7yAAAdxNGAfr0100.png-wh_50

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

swarm集羣上運行docker應用

概念解釋:service

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

服務包括兩種類型:

複製服務(replicated services):相似 k8s 中複製集的概念,保持必定數量的相同任務在集羣中運行;

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

 

發佈服務

manager上執行以下命令:

下面咱們能夠使用以前push到本地鏡像倉庫的鏡像啓動服務, centos:http爲例:

複製服務類型運行服務

manager上執行以下命令:

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

wKiom1mrxfOSCUsUAAAjK7W-NGQ339.png-wh_50

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

wKioL1mrxeejb03wAABZmNNgzqA183.png-wh_50

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

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

wKioL1mrxgLQhfa5AAAxkH7KDtM294.png-wh_50

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

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

wKiom1mrxiySvC1aAAAROb4ALmY752.png-wh_50

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

wKioL1mrxiGQ1RNGAABIaTdq2ZI848.png-wh_50

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

[root@node1 /]# docker service scale web1=3

wKiom1mrxlez5I7TAAAcYTQsvY8071.png-wh_50

wKiom1mrxmTjtZF8AAAWhv15hD4392.png-wh_50

能夠看到web1服務擴展到3個副本數。

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

[root@node1 /]# docker service scale web1=2

wKioL1mrxmTyrx5fAAAVFv3byWY972.png-wh_50

能夠看到web1服務縮減到2個副本數。

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

自修復(self-healing

wKiom1mrxpOyHLVUAAApqHy2_Gw850.png-wh_50

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

wKioL1mrxovxo3ZOAAAssES16NE652.png-wh_50

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

[root@node3 /]# docker stop $(docker ps -aq)

wKioL1mrxrPgkspcAAAJ5CWAQv8348.png-wh_50

結果:

wKiom1mrxtjw44a1AAAg4LV8DSM415.png-wh_50

能夠看到docker會在相同節點上啓動1個不一樣ID的容器。

Self-Organizing

如今咱們讓node3整個宕掉,node3上的容器會自動在其它節點上啓動。

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

[root@node3 /]# systemctl stop docker

結果: node1 上

wKioL1mrxtnigVi3AAAu_Iyv4F4502.png-wh_50

node2

wKiom1mrxwKQB2ZXAAAmXpIu4oI806.png-wh_50

能夠看到node3上的web2.2在node2上啓動了;至於node3上的web4.0則由於是全局服務類型,故而node3中止服務後,會停掉。

相關文章
相關標籤/搜索