Docker 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項目),通過
SwarmKit將節點分為兩類:
工作節點(Worker):負責通過執行容器運行任務。SwarmKit的默認執行器為Docker容器執行器(Docker Container Executor)。
(1)內建分布式存儲,不要額外的數據庫
(2)支持Rolling update
(3容器高可用
(4)通過TLS保證了節點之間通訊的安全
管理節點(Manager):負責接收和響應用戶請求,將集群狀態調節到最終狀態。在SwarmKit中,用戶可以動態調整節點的角色,即在Manager和Worker之間轉換。
如下圖所示,這是一個典型的
部署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集群管理端口
TCP與UDP端口7946節點之間通訊端口
TCP與UDP端口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上默認已有一個名為ingress的overlay 網絡, 可以直接使用, 但本文會創建一個新的
為我們的docker應用創建一個名為dockercoins的overlay 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名稱的service有2個副本分別運行在node2和node3節點上
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群集