Docker Swarm 是什麼?node
Docker Swarm是一個用於建立Docker主機(運行Docker守護進程的服務器)集羣的工具,使用Swarm操做集羣,會使用戶感受就像是在一臺主機上進行操做linux
docker1.12集成了swarmkit, 使你能夠不用安裝額外的軟件包, 使用簡單的命令啓動建立docker swarm集羣。git
若是你在運行 Docker 1.12時,你就能夠原生建立一個 Swarm 集羣 .github
集成了swarm集羣的安全特性, 集成了K-V存儲, 你如今不須要額外部署etcd或者consul。web
在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中,用戶能夠動態調整節點的角色,即在Manager和Worker之間轉換。
以下圖所示,這是一個典型的master-slave的架構。每一個節點都是運行着Docker Engine的Docker主機。一些節點有更高的權限,被稱爲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
[root@localhost ~]# sysctl -p net.ipv4.ip_forward = 1
4關閉selinux
[root@localhost ~]# setenforce 0
5 3臺主機修改/etc/hosts文件
Ping 連通性
開啓宿主機之間的端口
TCP端口2377集羣管理端口
TCP與UDP端口7946節點之間通信端口
TCP與UDP端口4789 overlay網絡通信端口
配置全部節點密鑰登陸.
配置所下節點密鑰互信, 在node1能夠免密碼登陸各節點,只在node1上執行:
生成sshkey
[root@localhost ~]# ssh-keygen
發佈sshkey到各個節點 ssh-copy-id node2 3 1
測試密鑰登陸
安裝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
1) 查看swarm集羣node列表
[root@localhost /]# docker node ls
咱們的其餘節點服務器,以worker角色加入swarm集羣須要登陸到服務器運行以下命令:
[root@localhost /]# docker swarm join-token worker
1) 其餘節點以worker加入集羣使用上面查看到的命令加入集羣(node二、node3上)
1) 查看集羣節點狀況,驗證加入與否
1) 提高node2爲管理
[root@node1 /]# 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。
上傳registry2.tar
運行容器(端口映射、隨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
查看私有倉庫(能夠看到倉庫爲空)
[root@node1 src]# curl 192.168.100.5:5000/v2/_catalog
1. 全部節點指向registry服務器:
中止docker服務
[root@node1 src]# vim /usr/lib/systemd/system/docker.service
[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 測試
overlay網絡
解決了鏡像構建問題, 爲了讓應用跑在swram集羣上,咱們還須要解決容器間的網絡訪問問題.
單臺服務器的時候咱們應用全部的容器都跑在一臺主機上, 因此容器之間的網絡是互通的. 如今咱們的集羣有3臺主機, 因此docker應用的服務會分佈在這3臺主機上.
如何保證不一樣主機上的容器網絡互通呢?
swarm集羣已經幫咱們解決了這個問題了,就是隻用overlay network.
在docker 1.12之前, swarm集羣須要一個額外的key-value存儲(consul, etcd). 來同步網絡配置, 保證全部容器在同一個網段中.
在docker 1.12已經內置了這個存儲, 集成了overlay networks的支持.
下面咱們演示下如何建立一個 overlay network:
注:swarm上默認已有一個名爲ingress的overlay 網絡, 能夠直接使用, 但本文會建立一個新的
爲咱們的docker應用建立一個名爲dockercoins的overlay network
1. node2上建立overlay network
[root@node2 apache]# docker network create --driver overlay dockercoins [root@node2 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上執行以下命令:
[root@node1 src]# docker service create --replicas 1 --network dockercoins --name web1 -p 8000:80 192.168.100.5:5000/centos:httpd efd1jxmt3pthvwscgkt1n1hj6
瀏覽器驗證:(三個節點ip:8000均可以訪問)
如運行web2,倆個容器運行服務:
[root@node1 src]# docker service create --replicas 2 --network dockercoins --name web2 -p 8080:80 192.168.100.5:5000/centos:httpd f2wh08sgy2q2wp5s63oczxk1t
從上圖能夠看到web2名稱的service有2個副本分別運行在node2和node3節點上
1. 以全局服務類型運行服務:
從下圖能夠看到服務web4在每一個節點上都運行一個
下面咱們擴展舊的服務,從下圖能夠看到web1 service目前只有一個副本
[root@node1 /]# docker service scale web1=3
能夠看到web1服務擴展到3個副本數。
3 縮減已有的服務副本數:
[root@node1 /]# docker service scale web1=2
能夠看到web1服務縮減到2個副本數。
Swarm節點是自組織(self-organizing)和自修復(self-healing)的,什麼意思?只要有節點或容器宕掉,swarm engine就會嘗試修復,下面咱們來具體看一下
自修復(self-healing)
能夠看到:3個節點,運行8個任務(容器)。包含一個registry容器。
咱們模擬讓node3上的容器都宕掉或部分宕掉
[root@node3 /]# docker stop $(docker ps -aq)
結果:
能夠看到docker會在相同節點上啓動1個不一樣ID的容器。
Self-Organizing
如今咱們讓node3整個宕掉,node3上的容器會自動在其它節點上啓動。
在manager節點上執行docker server ps服務名
[root@node3 /]# systemctl stop docker
結果: node1 上
node2
能夠看到node3上的web2.2在node2上啓動了;至於node3上的web4.0則由於是全局服務類型,故而node3中止服務後,會停掉。