詳解Docker Swarm概念與用法
Docker Swarm是Docker公司開發(fā)的容器集群管理服務(wù)。從1.12.0版本開始,已經(jīng)是Docker安裝后自帶的一部分(捆綁軟件)了,又稱為Swarm Mode,無需額外安裝。
與Kubernetes相比,Docker Swarm是一個簡單的軟件,似乎不堪大用。但是它與docker-compose兼容的優(yōu)點(diǎn),可以彌補(bǔ)一切。對于沒有集群使用經(jīng)驗(yàn)的小白,用Docker Swarm起步,是一個很好的選擇。
概念
Docker Swarm,主要包含以下概念:
- Swarm
- Node
- Stack
- Service
- Task
- Load balancing
Swarm本身就是“群”的意思,人群、蜂群。這里就是指計(jì)算機(jī)集群(cluster)在用Docker連接后的狀態(tài)。docker swarm命令可以創(chuàng)建、加入、離開一個集群。
Node就是計(jì)算機(jī)節(jié)點(diǎn),也可以認(rèn)為是一個Docker節(jié)點(diǎn)。Node分為兩類:Manager和Worker。一個Swarm至少要有一個Manager,部分管理命令只有在Manager上才能使用。兩類Node都可以運(yùn)行Service,但只有Manager上才能執(zhí)行運(yùn)行命令。比如,在Manager才能使用docker node命令可以查看、配置、刪除Node。
Stack是一組Service,和docker-compose類似。默認(rèn)情況下,一個Stack共用一個Network,相互可訪問,與其它Stack網(wǎng)絡(luò)隔絕。這個概念只是為了編排的方便。docker stack命令可以方便地操作一個Stack,而不用一個一個地操作Service。
Service是一類容器。對用戶來說,Service就是與Swarm交互的最核心內(nèi)容。Service有兩種運(yùn)行模式,一是replicated,指定一個Service運(yùn)行容器的數(shù)量;二是global,在所有符合運(yùn)行條件的Node上,都運(yùn)行一個這類容器。docker service命令可以操作Swarm中的Service。
Task就是指運(yùn)行一個容器的任務(wù),是Swarm執(zhí)行命令的最小單元。要成功運(yùn)行一個Service,需要執(zhí)行一個或多個Task(取決于一個Service的容器數(shù)量),確保每一個容器都順利啟動。通常用戶操作的是Service,而非Task。
Load balancing即負(fù)載均衡,也包含反向代理。Swarm使用的是Ingress形式的負(fù)載均衡,即訪問每個節(jié)點(diǎn)的某個Published端口,都可自動代理到真正的服務(wù)。大致原理如下圖所示。
Replicated Mode
services: some-serivce: ... deploy: mode: replicated replicas: 3
默認(rèn)情況下,mode就是replicated,所以這行可以省略。默認(rèn)replicas數(shù)目為1,代表這個Service只啟動1個容器。這個模式,可以按需啟動多個服務(wù),Swarm會自動調(diào)節(jié),有時一個Node會啟動多個容器。
Global Mode
services: some-serivce: ... deploy: mode: global placement: ...
所有可部署的Node,都部署一個。通過placement,可以限定滿足條件的Node,而避免在不合適的Node進(jìn)行部署。
操作
這里列出一些常用的具體操作。
創(chuàng)建第一個Node
docker swarm init --advertise-addr $IP
$IP是當(dāng)前Node的外部可訪問IP,便于其它Node尋址。
這樣,一個Swarm就被初始化完成了,它僅有一個Manager節(jié)點(diǎn)。
添加新的Node到Swarm
在Manager節(jié)點(diǎn),執(zhí)行以下命令可查看到如何加入一個Node:
$ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-2zspelk468gb6wgw5adea4wlbw4kfy3q1uhr86zpafl9m5a3ho-ezs4fylj526e801b3cl0pojr5 10.174.28.52:2377 $ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2zspelk468gb6wgw5adea4wlbw4kfy3q1uhr86zpafl9m5a3ho-164iqklrfv8o3t55g088hylyk 10.174.28.52:2377
在一個未加入任何Swarm的機(jī)器上,執(zhí)行以上顯示的命令docker swarm join --token ..., 即可成為這個Swarm的Manage或Worker節(jié)點(diǎn)。
設(shè)置節(jié)點(diǎn)Label
在Manager節(jié)點(diǎn),可以對任意節(jié)點(diǎn)設(shè)置標(biāo)簽:
docker node update $node_name --label-add main=true
$node_name就是要設(shè)置節(jié)點(diǎn)的ID或HOSTNAME。Label是鍵值對形式,main=true中的main就是鍵、true就是值。
設(shè)置了Label以后,在Compose文件中就可以用placement中的constraints來對可用節(jié)點(diǎn)作出限制。
services: some-serivce: ... deploy: placement: constraints: - node.labels.main == true ...
以上配置,讓some-service僅在Label被設(shè)置為main=true的節(jié)點(diǎn),才能使用。
啟動、停止服務(wù)
docker stack deploy $stack_name -c docker-compose.yaml -c other.yaml ...
$stack_name是Stack名稱??梢杂?c指定多個docker-compose文件,也可在相同Stack下分批次deploy多個文件。這些YAML文件的寫法,和原先用docker-compose命令執(zhí)行的沒有本質(zhì)區(qū)別,只是多加了以下獨(dú)特配置,并且會忽略一些Swarm場景下不支持的配置。
推薦使用docker-compose文件來編排Stack,而非直接用docker service create來手工創(chuàng)建。詳細(xì)配置項(xiàng),可參考《Compose file version 3 reference | Docker Documentation》。
需要停止Stack的所有服務(wù)時,可以執(zhí)行以下命令。
docker stack rm $stack_name
更新已運(yùn)行服務(wù)的鏡像
docker service update --image $image:$tag $service_name
以上就是詳解Docker Swarm概念與用法的詳細(xì)內(nèi)容,更多關(guān)于Docker Swarm的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Idea中使用Docker部署SpringBoot項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了在Idea中使用Docker部署SpringBoot項(xiàng)目的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09一文教會你用Docker打包Python運(yùn)行環(huán)境
Docker提供了容器級別的資源隔離,由于Python的外部依賴管理中存在的問題,我們通常會使用virtualenv來對不同的項(xiàng)目創(chuàng)建其唯一的依賴環(huán)境,下面這篇文章主要給大家介紹了如何通過一篇文章教會你用Docker打包Python運(yùn)行環(huán)境的相關(guān)資料,需要的朋友可以參考下2022-05-05Docker如何實(shí)現(xiàn)修改Docker0網(wǎng)橋默認(rèn)網(wǎng)段
這篇文章主要介紹了Docker如何實(shí)現(xiàn)修改Docker0網(wǎng)橋默認(rèn)網(wǎng)段,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Docker創(chuàng)建本地鏡像實(shí)現(xiàn)方法解析
這篇文章主要介紹了Docker創(chuàng)建本地鏡像實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10docker中Dockerfile方式建立鏡像HelloWorld
這篇文章主要介紹了docker中Dockerfile方式建立鏡像HelloWorld,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07