swarm集羣平常部分操做

docker swarm:html

1)查看集羣
使用docker info 或 docker node ls 查看集羣中的相關信息node

2)swarm集羣中node的availability狀態能夠爲 active或者drain,其中:
active狀態下,node能夠接受來自manager節點的任務分派;
drain狀態下,node節點會結束task,且再也不接受來自manager節點的任務分派(也就是下線節點)。
#docker node update --availability drain node1 //將node1節點下線。若是要刪除node1節點,命令是"docker node rm --force node1nginx

注意:當node1的狀態改成drain後,那麼該節點就不會接受task任務分發,就算以前已經接受的任務也會轉移到別的節點上。web

再次修改成active狀態(及將下線的節點再次上線)
#docker node update --availability active node1docker

3)在Swarm中部署服務(這裏以nginx服務爲例)
Docker 1.12版本提供服務的Scaling、health check、滾動升級等功能,並提供了內置的dns、vip機制,實現service的服務發現和負載均衡能力。bash

#docker network create -d overlay ngx_net //在啓動容器以前,先來建立一個覆蓋網絡,用來保證在不一樣主機上的容器網絡互通的網絡模式網絡

#docker network ls //查看負載均衡

在manager-node節點上使用上面這個覆蓋網絡建立nginx服務: 其中,--replicas 參數指定服務由幾個實例組成。
注意:不須要提早在節點上下載nginx鏡像,這個命令執行後會自動下載這個容器鏡像
#docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginxtcp

查看:
# docker service ls
ID NAME REPLICAS IMAGE COMMAND
0jb5eebo8j9q my-test 1/1 nginx測試

查詢Swarm中服務的信息
# docker service inspect --pretty my-test
ID: 0jb5eebo8j9qb1zc795vx3py3
Name: my-test
Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: nginx
Resources:
Networks: 3ye6vfp996i6eq17tue0c2jv9
Ports:
Protocol = tcp
TargetPort = 80
PublishedPort = 80

查詢到哪一個節點正在運行該服務。以下該容器被調度到manager-node節點上啓動了,而後訪問http://182.48.115.237便可訪問這個容器應用(若是調度到其餘節點,訪問也是如此)
[root@manager-node ~]# docker service ps my-test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
2m8qqpoa0dpeua5jbgz1infuy my-test.1 nginx manager-node Running Running 3 minutes ago

注意: 若是上面命令執行後,上面的 STATE 字段中剛開始的服務狀態爲 Preparing,須要等一會才能變爲 Running 狀態,其中最費時間的應該是下載鏡像的過程。

有上面命令可知,該服務在manager-node節點上運行。登錄該節點,能夠查看到nginx容器在運行中:
[root@manager-node ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ea1d72007da nginx:latest "nginx -g 'daemon off" 4 minutes ago Up 4 minutes 80/tcp my-test.1.2m8qqpoa0dpeua5jbgz1infuy

4)----------在Swarm中動態擴展服務(scale)------
Service還提供了複製(相似kubernetes裏的副本)功能。能夠經過 docker service scale 命令來設置服務中容器的副本數。
好比將上面的my-test容器動態擴展到5個,命令以下:
[root@manager-node ~]# docker service scale my-test=5

和建立服務同樣,增長scale數以後,將會建立新的容器,這些新啓動的容器也會經歷從準備到運行的過程,過一分鐘左右,服務應該就會啓動完成,這時候能夠再來看一下 nginx 服務中的容器
[root@manager-node ~]# docker service ps my-test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
2m8qqpoa0dpeua5jbgz1infuy my-test.1 nginx manager-node Running Running 9 minutes ago
aqko8yhmdj53gmzs8gqhoylc2 my-test.2 nginx node2 Running Running 2 minutes ago
erqk394hd4ay7nfwgaz4zp3s0 my-test.3 nginx node1 Running Running 2 minutes ago
2dslg6w16wzcgboa2hxw1c6k1 my-test.4 nginx node1 Running Running 2 minutes ago
bmyddndlx6xi18hx4yinpakf3 my-test.5 nginx manager-node Running Running 2 minutes ago

能夠看到,以前my-test容器只在manager-node節點上有一個實例,而如今又增長了4個實例。
這5個副本的my-test容器分別運行在這三個節點上,登錄這三個節點,就會發現已經存在運行着的my-test容器。

特別須要清楚的一點:
若是一個節點宕機了(即該節點就會從swarm集羣中被踢出),則Docker應該會將在該節點運行的容器調度到其餘節點,以知足指定數量的副本保持運行狀態。

好比:
將node1宕機後或將node1的docker服務關閉,那麼它上面的task實例就會轉移到別的節點上。當node1節點恢復後,它轉移出去的task實例不會主動轉移回來,
只能等別的節點出現故障後轉移task實例到它的上面。使用命令"docker node ls",發現node1節點已不在swarm集羣中了。


同理,swarm還能夠縮容,以下,將my-test容器變爲1個。
[root@manager-node ~]# docker service scale my-test=1
[root@manager-node ~]# docker service ps my-test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
2m8qqpoa0dpeuasdfsdfdfsdf my-test.1 nginx manager-node Running Running 3 minutes ago

登陸node2節點,使用docker ps查看,會發現容器被stop而非rm。

------------------------------------------------------------------------------------
刪除容器服務
[root@manager-node ~]# docker service --help //查看幫助
[root@manager-node ~]# docker service rm my-test //這樣就會把全部節點上的全部容器(task任務實例)所有刪除了
my-nginx

-------------------------------------------------------------------------------------
除了上面使用scale進行容器的擴容或縮容以外,還能夠使用docker service update 命令。 可對服務的啓動 參數 進行 更新/修改。
[root@manager-node ~]# docker service update --replicas 3 my-test
my-test

docker service update 命令,也可用於直接 升級 鏡像等。
[root@manager-node ~]# docker service update --image nginx:new my-test

5)Swarm中使用Volume(掛載目錄,mount)
查看docker volume的幫助信息
[root@manager-node ~]# docker volume --help

[root@manager-node ~]# docker volume create --name myvolume
myvolume

[root@manager-node ~]# docker volume ls
DRIVER VOLUME NAME
local 11b68dce3fff0d57172e18bc4e4cfc252b984354485d747bf24abc9b11688171
local 1cd106ed7416f52d6c77ed19ee7e954df4fa810493bb7e6cf01775da8f9c475f
local myvolume

參數src寫成source也能夠;dst表示容器內的路徑,也能夠寫成target
[root@manager-node ~]# docker service create --replicas 2 --mount type=volume,src=myvolume,dst=/peng --name test-nginx nginx

[root@manager-node ~]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
8s9m0okwlhvl test-nginx 2/2 nginx

[root@manager-node ~]# docker service ps test-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
32bqjjhqcl1k5z74ijjli35z3 test-nginx.1 nginx node1 Running Running 23 seconds ago
48xoypunb3g401jkn690lx7xt test-nginx.2 nginx node2 Running Running 23 seconds ago

登陸node1節點的test-nginx容器查看
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d471569629b2 nginx:latest "nginx -g 'daemon off" 2 minutes ago Up 2 minutes 80/tcp test-nginx.1.32bqjjhqcl1k5z74ijjli35z3

[root@node1 ~]# docker exec -ti d471569629b2 /bin/bash
root@d471569629b2:/# cd /peng/
root@d471569629b2:/peng# ls
root@d471569629b2:/peng# echo "ahahha" > test
root@d471569629b2:/peng# ls
test

[root@node1 ~]# docker volume inspect myvolume
[
{
"Name": "myvolume",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Labels": null,
"Scope": "local"
}
]

[root@node1 ~]# cd /var/lib/docker/volumes/myvolume/_data/
[root@node1 _data]# ls
test
[root@node1 _data]# cat test
ahahha
[root@node1 _data]# echo "12313" > 123
[root@node1 _data]# ls
123 test

root@d471569629b2:/peng# ls
123 test
root@d471569629b2:/peng# cat test
ahahha

還能夠將node1節點機上的volume數據目錄作成軟連接
[root@node1 ~]# ln -s /var/lib/docker/volumes/myvolume/_data /peng
[root@node1 ~]# cd /peng
[root@node1 peng]# ls
123 test
[root@node1 peng]# rm -f test
[root@node1 peng]# echo "5555" > haha

root@d471569629b2:/peng# ls
123 haha
root@d471569629b2:/peng# cat haha
5555

第二種方法:
命令格式: docker service create --mount type=bind,target=/container_data/,source=/host_data/
其中,參數target表示容器裏面的路徑,source表示本地硬盤路徑。

[root@manager-node ~]# docker service create --replicas 1 --mount type=bind,target=/usr/share/nginx/html/,source=/opt/web/ --network ngx_net --name haha-nginx -p 8880:80 nginx

[root@manager-node ~]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
9t9d58b5bq4u haha-nginx 1/1 nginx

[root@manager-node ~]# docker service ps haha-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
bji4f5tikhvm7nf5ief3jk2is haha-nginx.1 nginx node2 Running Running 18 seconds ago

登陸node2節點,在掛載目錄/opt/web下寫測試數據
[root@node2 _data]# cd /opt/web/
[root@node2 web]# ls
[root@node2 web]# cat peng.html
sdfasdf

登陸容器查看,發現已經實現數據同步
[root@node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3618e3d1b966 nginx:latest "nginx -g 'daemon off" 28 seconds ago Up 24 seconds 80/tcp haha-nginx.1.bji4f5tikhvm7nf5ief3jk2is

[root@node2 ~]# docker exec -ti 3618e3d1b966 /bin/bash
root@3618e3d1b966:/# cd /usr/share/nginx/html
root@3618e3d1b966:/usr/share/nginx/html# ls
peng.html
root@3618e3d1b966:/usr/share/nginx/html# cat peng.html
sdfasdf
root@3618e3d1b966:/usr/share/nginx/html# touch test
touch: cannot touch 'test': Permission denied

因而可知,以上設置後,在容器裏的同步目錄下沒有寫權限,更新內容時只要放到宿主機的掛載目錄下便可!

相關文章
相關標籤/搜索