docker swarm:
1)查看集群使用docker info 或 docker node ls 查看集群中的相关信息
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 node1
注意:当node1的状态改为drain之后,节点将不被接受task即使是以前接受的任务也会转移到其他节点。
再次修改为active状态(并将离线节点再次上线)#docker node update --availability active node1
3)在Swarm中部署服务(以下是nginx服务为例)Docker 1.12版提供服务Scaling、health check、滚动升级等功能,并提供内置功能dns、vip机制,实现service服务发现和负载平衡。
#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 nginx
查看:# docker service ls ID NAME REPLICAS IMAGE COMMAND0jb5eebo8j9q my-test 1/1 nginx
查询Swarm服务信息# docker service inspect --pretty my-testID: 0jb5eebo8j9qb1zc795vx3py3Name: my-testMode: Replicated Replicas: 1Placement:UpdateConfig: Parallelism: 1 On failure: pauseContainerSpec: Image: nginxResources:Networks: 3ye6vfp996i6eq17tue0c2jv9Ports: Protocol = tcp TargetPort = 80 PublishedPort = 80查询服务正在运行哪个节点。以下容器调度到manager-node启动节点,然后访问http://182.48.115.237即可访问这个容器应用(如果调度到其他节点,访问也是如此)[root@manager-node ~]# docker service ps my-testID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR2m8qqpoa0dpeua5jbgz1infuy my-test.1 nginx manager-node Running Running 3 minutes ago注意: 如果执行上述命令,上述命令 STATE 字段中最初的服务状态是 Preparing,要等一会儿才能变成 Running 状态,最耗时的应该是下载镜像的过程。
根据上述命令,该服务正在进行中manager-node操作节点。登录节点,查看nginx运行中容器:[root@manager-node ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1ea1d72007da 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-testID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR2m8qqpoa0dpeua5jbgz1infuy my-test.1 nginx manager-node Running Running 9 minutes agoaqko8yhmdj53gmzs8gqhoylc2 my-test.2 nginx node2 Running Runing 2 minutes agoerqk394hd4ay7nfwgaz4zp3s0 my-test.3 nginx node1 Running Running 2 minutes ago2dslg6w16wzcgboa2hxw1c6k1 my-test.4 nginx node1 Running Running 2 minutes agobmyddndlx6xi18hx4yinpakf3 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-testID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR2m8qqpoa0dpeuasdfsdfdfsdf 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-testmy-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 myvolumemyvolume
[root@manager-node ~]# docker volume lsDRIVER VOLUME NAMElocal 11b68dce3fff0d57172e18bc4e4cfc252b984354485d747bf24abc9b11688171local 1cd106ed7416f52d6c77ed19ee7e954df4fa810493bb7e6cf01775da8f9c475flocal 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 lsID NAME REPLICAS IMAGE COMMAND8s9m0okwlhvl test-nginx 2/2 nginx
[root@manager-node ~]# docker service ps test-nginxID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR32bqjjhqcl1k5z74ijjli35z3 test-nginx.1 nginx node1 Running Running 23 seconds ago48xoypunb3g401jkn690lx7xt test-nginx.2 nginx node2 Running Running 23 seconds ago
登录node1节点的test-nginx容器查看[root@node1 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd471569629b2 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/bashroot@d471569629b2:/# cd /peng/root@d471569629b2:/peng# lsroot@d471569629b2:/peng# echo "ahahha" > testroot@d471569629b2:/peng# lstest
[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]# lstest[root@node1 _data]# cat testahahha[root@node1 _data]# echo "12313" > 123[root@node1 _data]# ls123 test
root@d471569629b2:/peng# ls123 testroot@d471569629b2:/peng# cat testahahha还可以将node1节点机上的volume数据目录做成软链接[root@node1 ~]# ln -s /var/lib/docker/volumes/myvolume/_data /peng[root@node1 ~]# cd /peng[root@node1 peng]# ls123 test[root@node1 peng]# rm -f test[root@node1 peng]# echo "5555" > haharoot@d471569629b2:/peng# ls123 haharoot@d471569629b2:/peng# cat haha5555
第二种方法:命令格式: 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 lsID NAME REPLICAS IMAGE COMMAND9t9d58b5bq4u haha-nginx 1/1 nginx
[root@manager-node ~]# docker service ps haha-nginxID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERRORbji4f5tikhvm7nf5ief3jk2is 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.htmlsdfasdf
登录容器查看,发现已经实现数据同步[root@node2 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3618e3d1b966 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/bashroot@3618e3d1b966:/# cd /usr/share/nginx/htmlroot@3618e3d1b966:/usr/share/nginx/html# lspeng.htmlroot@3618e3d1b966:/usr/share/nginx/html# cat peng.htmlsdfasdfroot@3618e3d1b966:/usr/share/nginx/html# touch testtouch: cannot touch 'test': Permission denied
由此可见,以上设置后,在容器里的同步目录下没有写权限,更新内容时只要放到宿主机的挂载目录下即可!