docker1.12集成了swarmkit, 使你能夠不用安裝額外的軟件包, 使用簡單的命令啓動建立docker swarm集羣。node
若是你在運行 Docker 1.12時,你就能夠原生建立一個 Swarm 集羣 .python
集成了swarm集羣的安全特性, 集成了K-V存儲, 你如今不須要額外部署etcd或者consul。linux
在Docker1.12版本中,一個大的功能點是swarm集羣(基於swarmkit項目),經過Docker命令能夠直接實現docker-engine相互發現,並組建成爲一個容器集羣。web
SwarmKit將節點分爲兩類:docker
工做節點(Worker):負責經過執行器運行任務。SwarmKit的默認執行器爲Docker容器執行器(Docker Container Executor)。數據庫
(1)內建分佈式存儲,不要額外的數據庫centos
(2)支持Rolling update 瀏覽器
(3容器高可用安全
(4)經過TLS保證了節點之間通信的安全bash
管理節點(Manager):負責接收和響應用戶請求,將集羣狀態調節到最終狀態。在SwarmKit中,用戶能夠動態調整節點的角色,即在Manager和Worker之間轉換。
以下圖所示,這是一個典型的master-slave的架構。每一個節點都是運行着Docker Engine的Docker主機。一些節點有更高的權限,被稱爲Manager。下面的節點是worker節點,接收來自manager組的任務指示。
部署docker.12 Swarm
實驗環境:
1 )這裏選擇三臺主機運行Swarm,依次爲:
Vim /etc/hostname (更改好執行bash使其生效)
node1192.168.1.104
node2192.168.1.105
node3192.168.1.113
2) 基本環境配置
3臺主機確保時間一致
三臺主機以實現時間同步
3臺主機均關閉selinux,開啓路由轉發。
3 )系統環境準備
準備系統環境, 配置host列表
3臺主機均修改/etc/hosts文件,添加全部主機的ip地址和主機名的映射記錄
4 ) 3臺主機開啓宿主機之間的端口
TCP端口2377集羣管理端口
TCP與UDP端口7946節點之間通信端口
TCP與UDP端口4789 overlay網絡通信端口
(以host1 爲例,)
5 )配置全部節點密鑰登陸.
配置因此節密鑰互信, 在node1能夠免密碼登陸各節點,只在node1上執行:
生成sshkey
發佈sshkey到各個節點
把/root/.ssh目錄下的id_rsa.pub公鑰發佈給其它兩臺node主機上,發佈給那臺主機,就在那臺主機的/root/.ssh目錄下生產authorized.key文件,其內容和node1的id_rsa.pub同樣
測試密鑰登陸
6 )在全部節點上安裝docker 1.12(若是沒有docker 1.12軟件包,按照docs.docker.com官網安裝)
添加docker repo文件
rm -rf /etc/yum.repos.d/*
tee /etc/yum.repos.d/docker.repo<<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
安裝docker package
yum -y install docker-engine
我這裏已經有下載好的docker1.12軟件包,因此不適用上面提供的方法,直接使用rpm在三臺主機上都安裝
(以host1 爲例)
檢查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上運行.
解釋:根據如上命令的提示:
咱們的其餘節點服務器,以worker角色加入swarm集羣須要登陸到服務器運行以下命令:
以manager角色加入swarm集羣:
--advertise-addr參數, 後面跟你swarm集羣的通信地址, 也就是node1的地址.
查看端口號監聽狀況
檢查node1 docker swarm mode信息:
查看swarm集羣node列表
能夠看到,咱們的swarm集羣中只有一個節點.如今咱們把其餘節點加入咱們的集羣中:
把其餘節點加入集羣中:
注: 若是你不記得上面提示的加入swarm集羣的命令和密鑰可使用以下方式查看worker節點和manager節點的加入命令
在node1經過ssh, 在node2-node3上執行上面的加入集羣命令:
再次檢查集羣節點列表, 咱們能夠看到全部的服務器都已經加入swarm集羣了
不過如今集羣只有一個manager節點node1, 爲了swarm集羣的高可用,和避免單點故障. 咱們但願創建多個manager節點集羣.
只須要經過以下命令, 提高worker節點成manager節點:並
查看node2的docker info
如今咱們能夠看到, 已經有2個manager節點了, 一個Leader節點, 一個Reachable節點. 如今你也能夠在node2上面管理整個swarm集羣.
咱們的swarm集羣就搭建完畢了.
習慣使用docker命令幫助:docker<command> --help
總結:
docker swarm:集羣管理,子命令主要有下面幾個。
dockerswarm init命令用於初始化一個集羣
dockerswarm join命令用於加入一個現有集羣
dockerswarm leave命令因爲離開集羣
附:node下線
有些時候須要維護一個節點,此時此節點可能會網絡斷開或者須要關機,形成節點上服務可用。使用docker node update --availability drain <NODE-ID>將節點下線,swarm會將當前節點上的容器關閉並在其餘節點上啓動。當維護完成,須要上線是,將節點狀態修改成active狀態便可,命令以下:docker node update --availability active <NODE-ID>
有了Docker Swarm集羣咱們如何把咱們的應用跑在Swarm集羣上呢?
很簡單, 基本上原來咱們使用docker run的命令建立容器, 把前面替換成docker service create就好了.
建議搭建一個registry,爲所的docker主機提供鏡像下載,不然你須要在每一個docker主機本地存在容器鏡像。
因此搭建一個私有倉庫,由私有倉庫提供所須要的鏡像,
本實驗環境中用node2同時做爲registry。
拉取本地私有倉庫registry,查看registry鏡像
1開啓路由轉發
vi /etc/sysctl.cof
添加net.ipv4.ip_forward=1
執行sysctl -p使修改生效
2 將registry2.tar導入到本地,並查看
Registry1和registry2版本的區別
1 registry1是python語言寫的,而如今registry2版本即docker distribution更加安全和快速,而且是用go語言寫的。
基於私有倉庫鏡像運行容器
2默認狀況下,registry2會將倉庫存放於容器的/var/lib/registry目錄下,這樣若是容器被刪除,則存放於容器中的鏡像也會丟失,因此咱們通常狀況下會指定本地一個目錄掛載到容器的/var/lib/registry下,兩個目錄下都有!
·registry的默認存儲路徑是/var/lib/registry,只是個臨時目錄,一段時間以後就會消失
·因此使用-v參數,指定個本地持久的路徑,
返回{"repositories":[]} 說明registry服務工做正常.
注:鏡像信息存放在/var/lib/registry目錄下,所以這裏將宿主機目錄映射到/var/lib/registry
私有倉庫已搭建完畢
全部主機都指向registry服務器:(以node1爲例,其餘兩臺主機做相同的配置)
中止docker服務
重載docker服務並啓動docker服務
測試本地鏡像倉庫
有了本地鏡像倉庫registry, 如今咱們推送一個測試鏡像到本機鏡像倉庫, 測試下registry服務.
測試:在node1主機上推送鏡像到registry
若是想把鏡像推送到本地registry.
須要先tag這個鏡像的名字成<registry>/<p_w_picpath name>:<tag>,並查看鏡像
將tag後的鏡像上傳到registry.
push成功後, 能夠調用registry API查看 registry中的鏡像
在node3主機測試從registry下載鏡像,並查看
overlay網絡
解決了鏡像構建問題, 爲了讓應用跑在swram集羣上,咱們還須要解決容器間的網絡訪問問題.
單臺服務器的時候咱們應用全部的容器都跑在一臺主機上, 因此容器之間的網絡是互通的. 如今咱們的集羣有3臺主機, 因此docker應用的服務會分佈在這3臺主機上.
如何保證不一樣主機上的容器網絡互通呢?
swarm集羣已經幫咱們解決了這個問題了,就是隻用overlay network.
在docker 1.12之前, swarm集羣須要一個額外的key-value存儲(consul, etcdetc). 來同步網絡配置, 保證全部容器在同一個網段中.
在docker 1.12已經內置了這個存儲, 集成了overlay networks的支持.
下面咱們演示下如何建立一個 overlay network:
注:swarm上默認已有一個名爲ingress的overlay 網絡, 能夠直接使用, 但本文會建立一個新的
爲咱們的docker應用建立一個名爲dockercoins的overlay network
查詢docker network 列表
在網絡列表中你能夠看到dockercoins網絡的SCOPE是swarm, 表示該網絡在整個swarm集羣生效的, 其餘一些網絡是local, 表示本機網絡.
你只須要在manager節點建立network, swarm集羣會自動處理配置到其餘的節點,這是你能夠查看其餘節點的network. dockercoins網絡已經都建立了.:
注:一旦新的任務被指定給這個節點,Overlay網絡就會被按需建立。
在swarm集羣上運行docker應用
概念解釋:service
Docker1.12 swarm引入了服務的概念,一個服務由多個任務組成,一個任務即一個運行的容器。
服務包括兩種類型:
複製服務(replicated services):相似 k8s 中複製集的概念,保持必定數量的相同任務在集羣中運行;
全局服務(global services):相似 k8s 中 daemon 的概念,每一個工做節點上運行一個。
發佈服務:
下面咱們可使用以前push到本地鏡像倉庫的鏡像啓動服務, 以centos:http爲例:
以複製服務類型運行服務
在manager上執行以下命令:
docker service create命令建立一個 service.
--name標籤命名service爲web1.
--replicas標籤來聲明1個運行實體(即容器副本數)
注意, 咱們啓動的鏡像名字192.168.1.104:5000/centos:http使用咱們本地鏡像倉庫的鏡像名稱, 這樣當主機上沒有這個鏡像時, 會自動到本地鏡像倉庫拉取鏡像.
使用docker service ls查看服務
docker service inspect命令用戶查看service詳細信息
使用docker service ps <SERVICE-ID/NAME>查看服務運行在哪一個節點上
如今你能夠用瀏覽器訪問http://192.168.1.104:8000 就能訪問測試頁
事實上, 你能夠訪問swarm集羣中的全部節點 192.168.1.105、192.168.1.113的8000端口, 均可以訪問測試頁。(注:將firewall防火牆默認區域設置爲trusted)
在manager上執行以下命令:
--replicas標籤來聲明2個運行實體
查看服務:(需等待一會,纔會顯示REPLICAS)
從上圖能夠看到web2名稱的service有2個副本分別運行在node2和node3節點上。
以全局服務類型運行服務
從下圖能夠看到服務web4在每一個節點上都運行一個
下面咱們擴展舊的服務,從下圖能夠看到web1 service目前只有一個副本
擴展已有的服務的副本數,這裏將web1服務擴展到3個副本
縮減已有的服務的副本數,這裏將web1服務縮減到2個副本
Swarm節點是自組織(self-organizing)和自修復(self-healing)的,什麼意思?只要有節點或容器宕掉,swarm engine就會嘗試修復,下面咱們來具體看一下
自修復(self-healing)
通過上面的操做以後,咱們有如下3個節點:
運行着3個服務共7個任務(容器)
Node2節點上運行着容器3個容器還有一個私有倉庫註冊服務器容器
Node1節點上運行着容器2個容器
Node3節點上運行着容器2個容器
如今咱們讓node3上的容器都宕掉或部分宕掉
一旦node3上全部容器中止,Docker就會試圖在相同的節點上啓動2個不一樣ID的容器。
這就是Docker Swarm Engine的self-healing功能。
在node3節點上執行docker ps查看
Self-Organizing
如今咱們讓node3整個宕掉,node3上的容器會自動在其它節點上啓動。
在manager節點上執行docker server ps 服務名
總結:docker swarm 既能實現容器的高可用,也能實現負載均衡