docker swarm部署介紹
docker swarm
一、基本概念
Swarm是Docker引擎內建(原生)的叢集管理和編排工具。Docker Swarm是Docker官方三劍客專案之一,提供Docker容器叢集服務,是Docker官方對容器雲生態進行支援的核心方案。使用它,使用者可以將多個Docker主機封裝為單個大型的虛擬Docker主機,快速打造一套容器雲平臺。Swarm mode內建kv儲存功能,提供了眾多的新特性。比如:具有容錯能力的去中心化設計、內建服務發現、負載均衡、路由網格、動態伸縮、滾動更新、安全傳輸等。使得Docker原生的Swarm叢集具備與Mesos、Kubernetes競爭的實力。使用Swarm叢集之前需要了解以下幾個概念。
node節點
Docker的主機可以主動初始化一個Swarm叢集或者加入一個已存在的Swarm叢集,這樣這個執行Docker的主機就成為一個Swarm叢集的節點(node)。節點分為管理(manager)節點和工作(worker)節點。
管理節點用於Swarm叢集的管理,docker swarm命令基本只能在管理節點執行(節點退出叢集命令docker swarm leave可以在工作節點執行)。一個Swarm叢集可以有多個管理節點,但只有一個管理節點可以成為leader,leader通過raft協議實現。
工作節點是任務執行節點,管理節點將服務(service)下發至工作節點執行。管理節點預設也作為工作節點。也可以通過配置讓服務只執行在管理節點。
環境準備
docker | docker2 | docker3 |
---|---|---|
192.168.229.187 | 192.168.229.40 | 192.168.229.50 |
關閉防火牆、禁用selinux、3臺dockerhost區別主機名、時間同步。
docker版本必須是:v1.12版本開始;
Swarm:作用執行docker engine(引擎)的多個主機組成的叢集;
node:每一個docker engine都是一個node(節點),分為manager和worker;
manager node:負責執行容器的編排和叢集的管理工作,保持並維護swarm處於期望的狀態。swarm可以有多個manager node,他們會自動協調並選舉出一個Leader執行編排任務。但相反,不能沒有manager node。
worker node:接受並執行由manager node派發的任務,並且預設manager node也是一個work node,不過可以將它設定為manager-only node,讓它只負責編排和管理工作。
service:用來定義worker上執行的命令。
二、swarm的部署
1.初始化叢集
[root@docker ~]# docker swarm init --advertise-addr 192.168.229.187
Swarm initialized: current node (hcvxhgp8bmzjj2ip0uov0amgc) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-27putw1k9mgew1xsau9lt0enw9128x806pj89erz6rl60uf81c-6ombrpt2ua7h2vd7j8pio109n 192.168.229.187:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
–advertise-addr:指定與其他node通訊的地址。
上邊返回的結果告訴我們:初始化成功,如果想要新增worker節點執行下面的命令:
docker swarm join --token SWMTKN-1-27putw1k9mgew1xsau9lt0enw9128x806pj89erz6rl60uf81c-6ombrpt2ua7h2vd7j8pio109n 192.168.229.187:2377
注意:token只有24小時的有效期。
如果想要新增manager節點,執行下邊的命令:
docker swarm join-token manager
接下來我們把docker2和docker3以worker的身份加入到叢集中。
[root@docker2 ~]# docker swarm join --token SWMTKN-1-27putw1k9mgew1xsau9lt0enw9128x806pj89erz6rl60uf81c-6ombrpt2ua7h2vd7j8pio109n 192.168.229.187:2377
This node joined a swarm as a worker.
[root@docker3 ~]# docker swarm join --token SWMTKN-1-27putw1k9mgew1xsau9lt0enw9128x806pj89erz6rl60uf81c-6ombrpt2ua7h2vd7j8pio109n 192.168.229.187:2377
This node joined a swarm as a worker.
當其他兩個節點加入成功之後,我們可以執行docker node ls檢視節點詳情。
[root@docker ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
hcvxhgp8bmzjj2ip0uov0amgc * docker Ready Active Leader 18.09.0
4419pe146yj7nxjtltajqy65e docker2 Ready Active 18.09.0
jbgferutnebq81tpadopkrk56 docker3 Ready Active 18.09.0
基本操作命令
docker swarm leave:申請離開一個叢集,之後檢視節點狀態會變成down,然後可以通過manager node將其刪除;
docker node rm xxx:刪除某個狀態為down的節點;
docker swarm join-token [manager | worker]:生成令牌,可以是manager身份或worker身份;
docker node demote(降級):將swarm節點的manager降級為worker;
docker node promote(升級):將swarm節點的worker升級為manager;
docker node update --availability ("active"|"pause"|"drain");
通過設定節點的狀態,讓manager節點不參加實際的執行容器的任務;
2.部署docker swarm網路
overlay:覆蓋型網路
[root@docker ~]# docker network create -d overlay --attachable docker
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ba039c97d5ef bridge bridge local
imhd6gg3587a docker overlay swarm
f72f1e6808e7 docker_gwbridge bridge local
21f1bb57b242 host host local
mvcfw3lyjbvm ingress overlay swarm
655be92264b0 none null local
attachable:這個引數必須要加,否則不能用於容器。在建立網路的時候,我們並沒有部署一個儲存服務,比如consul,那是因為docker swarm自帶儲存。並且我們在docker上建立的此網路,在swarm的其他節點是檢視不到此網路資訊的,但卻能夠直接使用此網路。
3.部署一個圖形化web ui介面
[root@docker ~]# docker run -d -p 8080:8080 -e HOST=192.168.229.187 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
然後訪問瀏覽器驗證
192.168.229.187:8080
如果訪問不到網頁,需要開啟路由轉發。
[root@docker ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker ~]# sysctl -p
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
4.建立serveice
[root@docker ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx
replicas:期望的副本數量,可以理解為一個副本等於一個容器。
(1)檢視service
[root@docker ~]# docker service ls
(2)檢視service詳細資訊
[root@docker ~]# docker service ps xxx
(3)設定manager node不參加工作
[root@docker ~]# docker node update docker --availability drain
5.搭建私有倉庫
(1)用docker容器執行registry私有倉庫服務
下載需要的映象
[root@docker ~]# docker pull registry:2
(2)執行私有倉庫服務
[root@docker ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
(3)映象重新命名
因為我們使用的私有映象,在上傳或下載的時候都需要我們將映象的名稱直接重新命名,要註明它私有倉庫的IP地址:暴露埠。切記是必須,否則將識別不到倉庫而上傳或下載失敗。
格式為:docker tag IMAGE[:TAG]
[REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
[root@docker ~]# docker tag httpd:latest 192.168.229.187:5000/httpd:v1
(4)編輯docker配置檔案
因為docker預設是從dockehub上下載映象的,需要在本地指定一下私有倉庫的IP加埠,這是因為Docker預設不允許非HTTPS方式推送映象。如果沒做這一步,會報HTTPS的錯。
編輯docker的配置檔案,指定私有倉庫地址。
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.229.187:5000
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker.service
(5)上傳私有倉庫
[root@docker ~]# docker push 192.168.229.187:5000/httpd:v1
注意:既然是私有倉庫,肯定是要考慮多臺DockerHost共用的情況,如果有其他的DockerHost想要使用私有倉庫,僅需要修改docker的配置檔案,指定私有倉庫的IP和埠即可。
6.自定義映象
要求:基於httpd映象,更改主訪問介面內容。映象tag版本為v1.v2.v3,對
應主機面內容為111,222,333.
7.基於上述映象釋出服務
副本數量為3個,服務的名稱為:snow
[root@docker ~]# docker service create --replicas 3 --name snow -p 80:80 192.168.229.187:5000/httpd:v1
預設的Ingress網路,包括建立的自定義overlay網路,為後端真正為使用者提供服務的container,提供了一個統一的入口。
8.服務的擴容與縮容
[root@docker ~]# docker service scale snow=6
擴容與縮容直接通過scale進行設定副本數量。
9.服務的升級與回滾
[root@docker ~]# docker service update --image 192.168.229.187:5000/httpd:v2 snow
平滑更新
[root@docker ~]# docker service update --image 192.168.229.187:5000/httpd:v3 --update-parallelism 2 --update-delay 1m snow
注意:預設情況下,swarm一次只更新一個副本,並且兩個副本之間沒有等待時間,我們可以通過
–update-parallelism:設定並行更新的副本數量;
–update-delay:指定滾動更新的時間間隔;
回滾操作
[root@docker ~]# docker service rollback snow
注意:docker swarm的回滾操作,預設只能回滾到上一次操作的狀態,並不能連續回滾操作。
10.指定容器執行節點
[root@docker ~]# docker node update --help
--label-add list Add or update a node label (key=value)
給節點新增標籤。
這裡我們給docker2上新增一個標籤(磁碟容量最大)
[root@docker ~]# docker node update --label-add disk=max docker2
檢視標籤資訊
[root@docker ~]# docker node inspect docker2
"UpdatedAt": "2019-10-30T02:46:41.874901441Z",
"Spec": {
"Labels": {
"disk": "max"
...
刪除標籤
[root@docker ~]# docker node update --label-rm disk docker2
執行服務,指定節點
[root@docker ~]# docker service create --name test --replicas 3 --constraint 'node.labels.disk == max' nginx
[root@docker ~]# docker service ls
[root@docker ~]# docker service ps test
相關文章
- Docker Swarm Mode簡介DockerSwarm
- Docker Swarm從部署到基本操作DockerSwarm
- 【Docker】 SwarmDockerSwarm
- Docker介紹Docker
- Docker Swarm modeDockerSwarm
- Docker_Docker介紹1Docker
- docker 基本介紹Docker
- Docker 介紹 一Docker
- Docker學習—SwarmDockerSwarm
- 使用Docker Swarm快速搭建與部署你的服務叢集DockerSwarm
- 從docker介紹及其簡介Docker
- docker介紹、安裝Docker
- Docker Swarm 叢集搭建DockerSwarm
- 8、docker swarm操作使用DockerSwarm
- Docker Swarm叢集初探DockerSwarm
- Docker(六):Docker 三劍客之 Docker SwarmDockerSwarm
- Docker容器技術與Docker介紹Docker
- Docker內部元件介紹Docker元件
- Docker基本介紹及使用Docker
- Docker(二):Dockerfile 使用介紹Docker
- Docker Swarm常用命令DockerSwarm
- Docker Swarm 叢集搭建教程DockerSwarm
- Docker swarm叢集搭建教程DockerSwarm
- 1.07 容器編排docker SwarmDockerSwarm
- 用 Docker swarm 快速部署分散式圖資料庫 Nebula Graph 叢集DockerSwarm分散式資料庫
- 『中級篇』在docker-swarm叢集裡透過serivce部署worDockerSwarm
- 透過示例程式碼介紹Docker部署Mysql叢集的實現DockerMySql
- Docker的原理及特性介紹Docker
- 容器技術和Docker介紹Docker
- LNMP架構介紹與部署LNMP架構
- 使用Docker Swarm模式路由網格DockerSwarm模式路由
- Docker Swarm 叢集搭建實踐DockerSwarm
- K8s vs Docker SwarmK8SDockerSwarm
- 容器技術之Docker-swarmDockerSwarm
- Docker 多容器編排Swarm(六)DockerSwarm
- 「實戰篇」開源專案docker化運維部署-原始碼介紹(二)Docker運維原始碼
- Docker Swarm + Harbor + Portainer 打造高可用,高伸縮,叢集自動化部署,更新。DockerSwarmAI
- 容器技術|Docker三劍客之docker-swarmDockerSwarm