概述
docker swarm 是一個非常簡單的docker 原生叢集部署環境。在docker swarm 出來之前,要搭建一個docker 叢集需要複雜的網絡運維和配置能力,而docker swarm 把這一切都解放了。
簡單來說呢,docker swarm把多個docker節點連接配接成一個叢集,可以認為是一個可以互通的獨立區域網路,通過服務的方式管理應用的生命周期。例如有一個MyService的微服務,在單機的模式需要你分别在兩個節點上啟動相應的docker 容器,而docker swarm直接就有“服務”的概念,隻要在某一管理節點上執行建立服務指令,同時指定節點數為2,則叢集自動找兩個節點分别運作你的MyService微服務。當兩個節點扛不住的時候,你要增加到4個節點,則隻需要執行一個擴充指令就行。
docker 安裝
本文基于centos 版本7.2搭建的docker 叢集,用的是17.09版本的docker。
節點有192.168.0.37和192.168.0.38 兩個節點,分别為管理節點和工作節點。工作節點可以運作服務,管理節點也可以運作服務,但比工作節點多了“管理控制”的功能,即可以建立服務。為了避免腦裂現象,管理節點數量為1,3,5奇數。
分别在0.37和0.38上安裝docker。
媒體下載下傳
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/wget
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm安裝
yum install docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
啟動
systemctl start docker
開機啟動
systemctl enable docker
或者
chkconfig docker on
hostname
vi /etc/hosts 把兩個節點的host和ip加上。
搭建和使用 docker hub私有倉庫
搭建docker hub私有倉庫(0.37)
倉庫是用來存放docker鏡像的,在建立和啟動服務的時候,多個節點需要從倉庫中拉取鏡像。
sudo docker run -d -p 5000:5000 -v /root/hub:/var/lib/registry --restart=always --name registry2 registry:2
預設情況下,會将倉庫存放于容器内的/var/lib/registry目錄下,這樣如果容器被删除,則存放于容器中的鏡像也會丢失,是以我們一般情況下會指定本地一個目錄挂載。
https://github.com/docker/docker.github.io/blob/master/registry/index.md配置拉取鏡像認證(0.37/0.38)
用戶端通路docker hub拉取鏡像,預設走https的,會報
https://192.168.0.37:5000鏡像沒找到或不存在(No such image: 192.168.0.37:5000/cehome/operation-service:),解決方式一種是通過nginx 添加https代理,我們采用是另一種是非安全方式:
- 打開
- /usr/lib/systemd/system/docker.service
-
添加(ExecStart=/usr/bin/dockerd 可能已經有,隻需要添加insecure參數)
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.0.37:5000
-
重載
systemctl daemon-reload
-
重新開機
service docker restart
叢集環境搭建
參考:
https://docs.docker.com/engine/swarm/swarm-mode/ https://docs.docker.com/engine/reference/commandline/service/ https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/ https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/#replicated-and-global-services關閉防火牆(0.37/0.38)
需要互相通路2377等端口(為友善,直接關閉防火牆,否則可能會有不可意料的事情)
- 檢視
systemctl is-enabled firewalld
- 關閉
systemctl stop firewalld.service
- 禁用服務
systemctl disable firewalld
初始化管理節點(0.37)
docker swarm init --advertise-addr 192.168.0.37
( 多ip的情況:docker swarm init --advertise-addr ,一般要加上,否則會有網絡問題)
添加其它節點前檢視token(0.37)
添加其它節點到叢集,必須先在管理節點執行如下指令,它會列印出在其它節點将要執行的包含token的完整腳本。
1)檢視如何添加work節點
docker swarm join-token worker
2)檢視如何添加manager節點
docker swarm join-token manager
添加work節點(0.38)
通過上面的指令可以查出執行的腳本,然後拷貝到0.38并執行(即來源于0.37上面執行docker swarm join-token worker的列印結果),執行後0.38就加入了叢集。
docker swarm join\
--token SWMTKN-1-3jcd5cjgwy8ct1gfyqqy8oqnokz4jjaul7el97h77qii4e6zw3-1vrjlin1bl5k9whzc4fulqfh2 192.168.0.37:2377
檢視節點(0.37)
必須在管理節點才能執行:
docker node ls
建立overlay網絡
為什麼需要overlay 網絡?保證多台機器不同容器之間通信!
docker network create --attachable --driver overlay tiejia
--attachable 參數為了相容單機的容器可以加入此網絡。
tiejia是網絡名稱。
管理節點資訊的備份與恢複
由于目前是單管理節點,最好是備份資訊,主要步驟是停止docker,備份目錄/var/lib/docker/swarm/
https://docs.docker.com/engine/swarm/admin_guide/#back-up-the-swarm移除節點的指令(這裡隻是介紹,不要執行)
當你節點不需要的時候可以從叢集剝離,
docker swarm leave -f
例子:部署一個nginx 服務
在manager節點0.37上部署nginx服務,服務數量為3個,公開指定端口是8080映射容器80,使用nginx鏡像。這裡直接會從官網下載下傳nginx鏡像,上面部署的私有倉庫還用不上。
docker service create --replicas 3 --name nginx --publish 8080:80 nginx
通過 docker service ps nginx 指令檢視服務分布情況。