您好,登錄后才能下訂單哦!
Swarm 在 Docker 1.12 版本之前屬于一個(gè)獨(dú)立的項(xiàng)目,在 Docker 1.12 版本發(fā)布之后,該項(xiàng)目合并到了 Docker 中,成為 Docker 的一個(gè)子命令。目前,Swarm 是 Docker 社區(qū)提供的唯一一個(gè)原生支持 Docker 集群管理的工具。它可以把多個(gè) Docker 主機(jī)組成的系統(tǒng)轉(zhuǎn)換為單一的虛擬 Docker 主機(jī),使得容器可以組成跨主機(jī)的子網(wǎng)網(wǎng)絡(luò)。
1. Swarm 認(rèn)識(shí)
Swarm 是目前 Docker 官方唯一指定(綁定)的集群管理工具。Docker 1.12 內(nèi)嵌了 swarm mode 集群管理模式。
為了方便演示跨主機(jī)網(wǎng)絡(luò),我們需要用到一個(gè)工具——Docker Machine,這個(gè)工具與 Docker Compose、Docker Swarm 并稱 Docker 三劍客,下面我們來看看如何安裝 Docker Machine:
$ curl -L https://github.com/docker/machine/releases/download/v0.9.0-rc2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && chmod +x /tmp/docker-machine && sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
安裝過程和 Docker Compose 非常類似?,F(xiàn)在 Docker 三劍客已經(jīng)全部到齊了。
在開始之前,我們需要了解一些基本概念,有關(guān)集群的 Docker 命令如下:
docker swarm:集群管理,子命令有 init, join,join-token, leave, update
docker node:節(jié)點(diǎn)管理,子命令有 demote, inspect,ls, promote, rm, ps, update
docker service:服務(wù)管理,子命令有 create, inspect, ps, ls ,rm , scale, update
docker stack/deploy:試驗(yàn)特性,用于多應(yīng)用部署,等正式版加進(jìn)來再說。
2. 創(chuàng)建集群
首先使用 Docker Machine 創(chuàng)建一個(gè)虛擬機(jī)作為 manger 節(jié)點(diǎn)。
$ docker-machine create --driver virtualbox manager1 Running pre-create checks... (manager1) Unable to get the latest Boot2Docker ISO release version: Get https://api.github.com/repos/boot2docker/boot2docker/releases/latest: dial tcp: lookup api.github.com on [::1]:53: server misbehaving Creating machine... (manager1) Unable to get the latest Boot2Docker ISO release version: Get https://api.github.com/repos/boot2docker/boot2docker/releases/latest: dial tcp: lookup api.github.com on [::1]:53: server misbehaving (manager1) Copying /home/zuolan/.docker/machine/cache/boot2docker.iso to /home/zuolan/.docker/machine/machines/manager1/boot2docker.iso... (manager1) Creating VirtualBox VM... (manager1) Creating SSH key... (manager1) Starting the VM... (manager1) Check network to re-create if needed... (manager1) Found a new host-only adapter: "vboxnet0" (manager1) Waiting for an IP... Waiting for machine to be running, this may take a few minutes... Detecting operating system of created instance... Waiting for SSH to be available... Detecting the provisioner... Provisioning with boot2docker... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Checking connection to Docker... Docker is up and running! To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env manager1
查看虛擬機(jī)的環(huán)境變量等信息,包括虛擬機(jī)的 IP 地址:
$ docker-machine env manager1 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.100:2376" export DOCKER_CERT_PATH="/home/zuolan/.docker/machine/machines/manager1" export DOCKER_MACHINE_NAME="manager1" # Run this command to configure your shell: # eval $(docker-machine env manager1)
然后再創(chuàng)建一個(gè)節(jié)點(diǎn)作為 work 節(jié)點(diǎn)。
$ docker-machine create --driver virtualbox worker1
現(xiàn)在我們有了兩個(gè)虛擬主機(jī),使用 Machine 的命令可以查看:
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS manager1 - virtualbox Running tcp://192.168.99.100:2376 v1.12.3 worker1 - virtualbox Running tcp://192.168.99.101:2376 v1.12.3
但是目前這兩臺(tái)虛擬主機(jī)并沒有什么聯(lián)系,為了把它們聯(lián)系起來,我們需要 Swarm 登場(chǎng)了。
因?yàn)槲覀兪褂玫氖?Docker Machine 創(chuàng)建的虛擬機(jī),因此可以使用 docker-machine ssh 命令來操作虛擬機(jī),在實(shí)際生產(chǎn)環(huán)境中,并不需要像下面那樣操作,只需要執(zhí)行 docker swarm 即可。
把 manager1 加入集群:
$ docker-machine ssh manager1 docker swarm init --listen-addr 192.168.99.100:2377 --advertise-addr 192.168.99.100 Swarm initialized: current node (23lkbq7uovqsg550qfzup59t6) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \ 192.168.99.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
用 --listen-addr 指定監(jiān)聽的 ip 與端口,實(shí)際的 Swarm 命令格式如下,本例使用 Docker Machine 來連接虛擬機(jī)而已:
$ docker swarm init --listen-addr <MANAGER-IP>:<PORT>
接下來,再把 work1 加入集群中:
$ docker-machine ssh worker1 docker swarm join --token \ SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \ 192.168.99.100:2377 This node joined a swarm as a worker.
上面 join 命令中可以添加 --listen-addr $WORKER1_IP:2377 作為監(jiān)聽準(zhǔn)備,因?yàn)橛袝r(shí)候可能會(huì)遇到把一個(gè) work 節(jié)點(diǎn)提升為 manger 節(jié)點(diǎn)的可能,當(dāng)然本例子沒有這個(gè)打算就不添加這個(gè)參數(shù)了。
注意:如果你在新建集群時(shí)遇到雙網(wǎng)卡情況,可以指定使用哪個(gè) IP,例如上面的例子會(huì)有可能遇到下面的錯(cuò)誤。
$ docker-machine ssh manager1 docker swarm init --listen-addr $MANAGER1_IP:2377 Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (10.0.2.15 on eth0 and 192.168.99.100 on eth2) - specify one with --advertise-addr exit status 1
發(fā)生錯(cuò)誤的原因是因?yàn)橛袃蓚€(gè) IP 地址,而 Swarm 不知道用戶想使用哪個(gè),因此要指定 IP。
$ docker-machine ssh manager1 docker swarm init --advertise-addr 192.168.99.100 --listen-addr 192.168.99.100:2377 Swarm initialized: current node (ahvwxicunjd0z8g0eeosjztjx) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \ 192.168.99.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
集群初始化成功。
現(xiàn)在我們新建了一個(gè)有兩個(gè)節(jié)點(diǎn)的“集群”,現(xiàn)在進(jìn)入其中一個(gè)管理節(jié)點(diǎn)使用 docker node 命令來查看節(jié)點(diǎn)信息:
$ docker-machine ssh manager1 docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 23lkbq7uovqsg550qfzup59t6 * manager1 Ready Active Leader dqb3fim8zvcob8sycri3hy98a worker1 Ready Active
現(xiàn)在每個(gè)節(jié)點(diǎn)都?xì)w屬于 Swarm,并都處在了待機(jī)狀態(tài)。Manager1 是領(lǐng)導(dǎo)者,work1 是工人。
現(xiàn)在,我們繼續(xù)新建虛擬機(jī) manger2、worker2、worker3,現(xiàn)在已經(jīng)有五個(gè)虛擬機(jī)了,使用 docker-machine ls 來查看虛擬機(jī):
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS manager1 - virtualbox Running tcp://192.168.99.100:2376 v1.12.3 manager2 - virtualbox Running tcp://192.168.99.105:2376 v1.12.3 worker1 - virtualbox Running tcp://192.168.99.102:2376 v1.12.3 worker2 - virtualbox Running tcp://192.168.99.103:2376 v1.12.3 worker3 - virtualbox Running tcp://192.168.99.104:2376 v1.12.3
然后我們把剩余的虛擬機(jī)也加到集群中。
添加 worker2 到集群中:
$ docker-machine ssh worker2 docker swarm join \ --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \ 192.168.99.100:2377 This node joined a swarm as a worker.
添加 worker3 到集群中:
$ docker-machine ssh worker3 docker swarm join \ --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-c036gwrakjejql06klrfc585r \ 192.168.99.100:2377 This node joined a swarm as a worker.
添加 manager2 到集群中:
先從 manager1 中獲取 manager 的 token:
$ docker-machine ssh manager1 docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-8tn855hkjdb6usrblo9iu700o \ 192.168.99.100:2377
然后添加 manager2 到集群中:
$ docker-machine ssh manager2 docker swarm join \ --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-8tn855hkjdb6usrblo9iu700o \ 192.168.99.100:2377 This node joined a swarm as a manager.
現(xiàn)在再來查看集群信息:
$ docker-machine ssh manager2 docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 16w80jnqy2k30yez4wbbaz1l8 worker1 Ready Active 2gkwhzakejj72n5xoxruet71z worker2 Ready Active 35kutfyn1ratch65fn7j3fs4x worker3 Ready Active a9r21g5iq1u6h41myprfwl8ln * manager2 Ready Active Reachable dpo7snxbz2a0dxvx6mf19p35z manager1 Ready Active Leader
3. 建立跨主機(jī)網(wǎng)絡(luò)
為了演示更清晰,下面我們把宿主機(jī)也加入到集群之中,這樣我們使用 Docker 命令操作會(huì)清晰很多。
直接在本地執(zhí)行加入集群命令:
$ docker swarm join \ --token SWMTKN-1-3z5rzoey0u6onkvvm58f7vgkser5d7z8sfshlu7s4oz2gztlvj-8tn855hkjdb6usrblo9iu700o \ 192.168.99.100:2377 This node joined a swarm as a manager.
現(xiàn)在我們有三臺(tái) manager,三臺(tái) worker。其中一臺(tái)是宿主機(jī),五臺(tái)虛擬機(jī)。
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 6z2rpk1t4xucffzlr2rpqb8u3 worker3 Ready Active 7qbr0xd747qena4awx8bx101s * user-pc Ready Active Reachable 9v93sav79jqrg0c7051rcxxev manager2 Ready Active Reachable a1ner3zxj3ubsiw4l3p28wrkj worker1 Ready Active a5w7h8j83i11qqi4vlu948mad worker2 Ready Active d4h7vuekklpd6189fcudpfy18 manager1 Ready Active Leader
查看網(wǎng)絡(luò)狀態(tài):
$ docker network ls NETWORK ID NAME DRIVER SCOPE 764ff31881e5 bridge bridge local fbd9a977aa03 host host local 6p6xlousvsy2 ingress overlay swarm e81af24d643d none null local
可以看到在 swarm 上默認(rèn)已有一個(gè)名為 ingress 的 overlay 網(wǎng)絡(luò), 默認(rèn)在 swarm 里使用,本例子中會(huì)創(chuàng)建一個(gè)新的 overlay 網(wǎng)絡(luò)。
$ docker network create --driver overlay swarm_test 4dm8cy9y5delvs5vd0ghdd89s $ docker network ls NETWORK ID NAME DRIVER SCOPE 764ff31881e5 bridge bridge local fbd9a977aa03 host host local 6p6xlousvsy2 ingress overlay swarm e81af24d643d none null local 4dm8cy9y5del swarm_test overlay swarm
這樣一個(gè)跨主機(jī)網(wǎng)絡(luò)就搭建好了,但是現(xiàn)在這個(gè)網(wǎng)絡(luò)只是處于待機(jī)狀態(tài),下一小節(jié)我們會(huì)在這個(gè)網(wǎng)絡(luò)上部署應(yīng)用。
4. 在跨主機(jī)網(wǎng)絡(luò)上部署應(yīng)用
首先我們上面創(chuàng)建的節(jié)點(diǎn)都是沒有鏡像的,因此我們要逐一 pull 鏡像到節(jié)點(diǎn)中,這里我們使用前面搭建的私有倉庫。
$ docker-machine ssh manager1 docker pull reg.example.com/library/nginx:alpine alpine: Pulling from library/nginx e110a4a17941: Pulling fs layer ... ... 7648f5d87006: Pull complete Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe Status: Downloaded newer image for reg.example.com/library/nginx:alpine $ docker-machine ssh manager2 docker pull reg.example.com/library/nginx:alpine alpine: Pulling from library/nginx e110a4a17941: Pulling fs layer ... ... 7648f5d87006: Pull complete Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe Status: Downloaded newer image for reg.example.com/library/nginx:alpine $ docker-machine ssh worker1 docker pull reg.example.com/library/nginx:alpine alpine: Pulling from library/nginx e110a4a17941: Pulling fs layer ... ... 7648f5d87006: Pull complete Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe Status: Downloaded newer image for reg.example.com/library/nginx:alpine $ docker-machine ssh worker2 docker pull reg.example.com/library/nginx:alpine alpine: Pulling from library/nginx e110a4a17941: Pulling fs layer ... ... 7648f5d87006: Pull complete Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe Status: Downloaded newer image for reg.example.com/library/nginx:alpine $ docker-machine ssh worker3 docker pull reg.example.com/library/nginx:alpine alpine: Pulling from library/nginx e110a4a17941: Pulling fs layer ... ... 7648f5d87006: Pull complete Digest: sha256:65063cb82bf508fd5a731318e795b2abbfb0c22222f02ff5c6b30df7f23292fe Status: Downloaded newer image for reg.example.com/library/nginx:alpine
上面使用 docker pull 分別在五個(gè)虛擬機(jī)節(jié)點(diǎn)拉取 nginx:alpine 鏡像。接下來我們要在五個(gè)節(jié)點(diǎn)部署一組 Nginx 服務(wù)。
部署的服務(wù)使用 swarm_test 跨主機(jī)網(wǎng)絡(luò)。
$ docker service create --replicas 2 --name helloworld --network=swarm_test nginx:alpine 5gz0h3s5agh3d2libvzq6bhgs
查看服務(wù)狀態(tài):
$ docker service ls ID NAME REPLICAS IMAGE COMMAND 5gz0h3s5agh3 helloworld 0/2 nginx:alpine
查看 helloworld 服務(wù)詳情(為了方便閱讀,已調(diào)整輸出內(nèi)容):
$ docker service ps helloworld ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR ay081uome3 helloworld.1 nginx:alpine manager1 Running Preparing 2 seconds ago 16cvore0c96 helloworld.2 nginx:alpine worker2 Running Preparing 2 seconds ago
可以看到兩個(gè)實(shí)例分別運(yùn)行在兩個(gè)節(jié)點(diǎn)上。
進(jìn)入兩個(gè)節(jié)點(diǎn),查看服務(wù)狀態(tài)(為了方便閱讀,已調(diào)整輸出內(nèi)容):
$ docker-machine ssh manager1 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 119f787622c2 nginx:alpine "nginx -g ..." 4 minutes ago Up 4 minutes 80/tcp, 443/tcp hello ... $ docker-machine ssh worker2 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5db707401a06 nginx:alpine "nginx -g ..." 4 minutes ago Up 4 minutes 80/tcp, 443/tcp hello ...
上面輸出做了調(diào)整,實(shí)際的 NAMES 值為:
helloworld.1.ay081uome3eejeg4mspa8pdlx helloworld.2.16cvore0c96rby1vp0sny3mvt
記住上面這兩個(gè)實(shí)例的名稱?,F(xiàn)在我們來看這兩個(gè)跨主機(jī)的容器是否能互通:
首先使用 Machine 進(jìn)入 manager1 節(jié)點(diǎn),然后使用 docker exec -i 命令進(jìn)入 helloworld.1 容器中 ping 運(yùn)行在 worker2 節(jié)點(diǎn)的 helloworld.2 容器。
$ docker-machine ssh manager1 docker exec -i helloworld.1.ay081uome3eejeg4mspa8pdlx \ ping helloworld.2.16cvore0c96rby1vp0sny3mvt PING helloworld.2.16cvore0c96rby1vp0sny3mvt (10.0.0.4): 56 data bytes 64 bytes from 10.0.0.4: seq=0 ttl=64 time=0.591 ms 64 bytes from 10.0.0.4: seq=1 ttl=64 time=0.594 ms 64 bytes from 10.0.0.4: seq=2 ttl=64 time=0.624 ms 64 bytes from 10.0.0.4: seq=3 ttl=64 time=0.612 ms ^C
然后使用 Machine 進(jìn)入 worker2 節(jié)點(diǎn),然后使用 docker exec -i 命令進(jìn)入 helloworld.2 容器中 ping 運(yùn)行在 manager1 節(jié)點(diǎn)的 helloworld.1 容器。
$ docker-machine ssh worker2 docker exec -i helloworld.2.16cvore0c96rby1vp0sny3mvt \ ping helloworld.1.ay081uome3eejeg4mspa8pdlx PING helloworld.1.ay081uome3eejeg4mspa8pdlx (10.0.0.3): 56 data bytes 64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.466 ms 64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.465 ms 64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.548 ms 64 bytes from 10.0.0.3: seq=3 ttl=64 time=0.689 ms ^C
可以看到這兩個(gè)跨主機(jī)的服務(wù)集群里面各個(gè)容器是可以互相連接的。
為了體現(xiàn) Swarm 集群的優(yōu)勢(shì),我們可以使用虛擬機(jī)的 ping 命令來測(cè)試對(duì)方虛擬機(jī)內(nèi)的容器。
$ docker-machine ssh worker2 ping helloworld.1.ay081uome3eejeg4mspa8pdlx PING helloworld.1.ay081uome3eejeg4mspa8pdlx (221.179.46.190): 56 data bytes 64 bytes from 221.179.46.190: seq=0 ttl=63 time=48.651 ms 64 bytes from 221.179.46.190: seq=1 ttl=63 time=63.239 ms 64 bytes from 221.179.46.190: seq=2 ttl=63 time=47.686 ms 64 bytes from 221.179.46.190: seq=3 ttl=63 time=61.232 ms ^C $ docker-machine ssh manager1 ping helloworld.2.16cvore0c96rby1vp0sny3mvt PING helloworld.2.16cvore0c96rby1vp0sny3mvt (221.179.46.194): 56 data bytes 64 bytes from 221.179.46.194: seq=0 ttl=63 time=30.150 ms 64 bytes from 221.179.46.194: seq=1 ttl=63 time=54.455 ms 64 bytes from 221.179.46.194: seq=2 ttl=63 time=73.862 ms 64 bytes from 221.179.46.194: seq=3 ttl=63 time=53.171 ms ^C
上面我們使用了虛擬機(jī)內(nèi)部的 ping 去測(cè)試容器的延遲,可以看到延遲明顯比集群內(nèi)部的 ping 值要高。
5. Swarm 集群負(fù)載
現(xiàn)在我們已經(jīng)學(xué)會(huì)了 Swarm 集群的部署方法,現(xiàn)在來搭建一個(gè)可訪問的 Nginx 集群吧。體驗(yàn)最新版的 Swarm 所提供的自動(dòng)服務(wù)發(fā)現(xiàn)與集群負(fù)載功能。
首先刪掉上一節(jié)我們啟動(dòng)的 helloworld 服務(wù):
$ docker service rm helloworld helloworld
然后在新建一個(gè)服務(wù),提供端口映射參數(shù),使得外界可以訪問這些 Nginx 服務(wù):
$ docker service create --replicas 2 --name helloworld -p 7080:80 --network=swarm_test nginx:alpine 9gfziifbii7a6zdqt56kocyun
查看服務(wù)運(yùn)行狀態(tài):
$ docker service ls ID NAME REPLICAS IMAGE COMMAND 9gfziifbii7a helloworld 2/2 nginx:alpine
不知你有沒有發(fā)現(xiàn),雖然我們使用 --replicas 參數(shù)的值都是一樣的,但是上一節(jié)中獲取服務(wù)狀態(tài)時(shí),REPLICAS 返回的是 0/2,現(xiàn)在的 REPLICAS 返回的是 2/2。
同樣使用 docker service ps 查看服務(wù)詳細(xì)狀態(tài)時(shí)(下面輸出已經(jīng)手動(dòng)調(diào)整為更易讀的格式),可以看到實(shí)例的 CURRENT STATE 中是 Running 狀態(tài)的,而上一節(jié)中的 CURRENT STATE 中全部是處于 Preparing 狀態(tài)。
$ docker service ps helloworld ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 9ikr3agyi... helloworld.1 nginx:alpine user-pc Running Running 13 seconds ago 7acmhj0u... helloworld.2 nginx:alpine worker2 Running Running 6 seconds ago
這就涉及到 Swarm 內(nèi)置的發(fā)現(xiàn)機(jī)制了,目前 Docker 1.12 中 Swarm 已經(jīng)內(nèi)置了服務(wù)發(fā)現(xiàn)工具,我們不再需要像以前使用 Etcd 或者 Consul 這些工具來配置服務(wù)發(fā)現(xiàn)。對(duì)于一個(gè)容器來說如果沒有外部通信但又是運(yùn)行中的狀態(tài)會(huì)被服務(wù)發(fā)現(xiàn)工具認(rèn)為是 Preparing 狀態(tài),本小節(jié)例子中因?yàn)橛成淞硕丝冢虼擞辛?Running 狀態(tài)。
現(xiàn)在我們來看 Swarm 另一個(gè)有趣的功能,當(dāng)我們殺死其中一個(gè)節(jié)點(diǎn)時(shí),會(huì)發(fā)生什么。
首先 kill 掉 worker2 的實(shí)例:
$ docker-machine ssh worker2 docker kill helloworld.2.7acmhj0udzusv1d7lu2tbuhu4 helloworld.2.7acmhj0udzusv1d7lu2tbuhu4
稍等幾秒,再來看服務(wù)狀態(tài):
$ docker service ps helloworld ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 9ikr3agyi... helloworld.1 nginx:alpine zuolan-pc Running Running 19 minutes ago 8f866igpl... helloworld.2 nginx:alpine manager1 Running Running 4 seconds ago 7acmhj0u... \_ helloworld.2 nginx:alpine worker2 Shutdown Failed 11 seconds ago ...exit... $ docker service ls ID NAME REPLICAS IMAGE COMMAND 9gfziifbii7a helloworld 2/2 nginx:alpine
可以看到即使我們 kill 掉其中一個(gè)實(shí)例,Swarm 也會(huì)迅速把停止的容器撤下來,同時(shí)在節(jié)點(diǎn)中啟動(dòng)一個(gè)新的實(shí)例頂上來。這樣服務(wù)依舊還是兩個(gè)實(shí)例在運(yùn)行。
此時(shí)如果你想添加更多實(shí)例可以使用 scale 命令:
$ docker service scale helloworld=3 helloworld scaled to 3
查看服務(wù)詳情,可以看到有三個(gè)實(shí)例啟動(dòng)了:
$ docker service ps helloworld ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 9ikr3agyi... helloworld.1 nginx:alpine user-pc Running Running 30 minutes ago 8f866igpl... helloworld.2 nginx:alpine manager1 Running Running 11 minutes ago 7acmhj0u... \_ helloworld.2 nginx:alpine worker2 Shutdown Failed 11 minutes ago exit137 1vexr1jm... helloworld.3 nginx:alpine worker2 Running Running 4 seconds ago
現(xiàn)在如果想減少實(shí)例數(shù)量,一樣可以使用 scale 命令:
$ docker service scale helloworld=2 helloworld scaled to 2
至此,Swarm的主要用法都已經(jīng)介紹完了,主要講述了 Swarm 集群網(wǎng)絡(luò)的創(chuàng)建與部署。介紹了 Swarm 的常規(guī)應(yīng)用,包括 Swarm 的服務(wù)發(fā)現(xiàn)、負(fù)載均衡等,然后使用 Swarm 來配置跨主機(jī)容器網(wǎng)絡(luò),并在上面部署應(yīng)用。
關(guān)于Swarm的更多實(shí)戰(zhàn)例子,以后有機(jī)會(huì)還會(huì)寫的,就這樣啦。
總結(jié)
以上就是本文關(guān)于Docker Swarm 入門實(shí)例詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助,感興趣的朋友可以參閱:Windows使用docker打開新窗口error解決辦法、詳解Docker使用Linux iptables 和 Interfaces管理容器網(wǎng)絡(luò)、淺談Docker安全機(jī)制內(nèi)核安全與容器之間的網(wǎng)絡(luò)安全等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。