赞
踩
部署web_server
[root@node1 ~]# docker service create --name web_server --replicas=2 192.168.19.130:5000/httpd
启动了一个容器,是 web_server 的一个副本,容器监听了80 端口,但是并没有映射到 Docker host,所以只能通过容器的IP访问。
查看一下IP
[root@node1 ~]# docker inspect b6604d0c0469
"IPAdderss":"172.17.0.4",
进行访问:
[root@node1 ~]# curl 172.17.0.4
<html><body><h1>It works!</h1></body></html>
从外网访问service
需要将 service 暴露到外部
[root@node1 ~]# docker service update --publish-add 8080:80 web_server
[root@node1 ~]# curl 192.168.19.130:8080
<html><body><h1>It works!</h1></body></html>
[root@node1 ~]# curl 192.168.19.131:8080
<html><body><h1>It works!</h1></body></html>
[root@node1 ~]# curl 192.168.19.132:8080
<html><body><h1>It works!</h1></body></html>
ingree网络
当我们应用 - -public-add 8080:80 时,swarm会重新配置 service,之前所有的副本都被 shutdowm,启动了新的副本。
容器的网络与- -publish-add之前已经大不一样了,现在有两块网卡,每块网卡连接不同的Docker网络。
实际上:
eth0 连接的是一个overlay类型的网络,名字为ingress,其作用是让运行在不同主机上的容器可以相互通。
eth1连接的是一个bridge类型的网络,名字为docker gwbridge, 其作用是让容器能够访问到外网。
ingress网络是swarm创建时Docker为自动我们创建的,swarm 中的每个node都能使用ingress。
通过overlay网络,主机与容器、容器与容器之间可以相互访问;同时,routing mesh将外部请求路由到不同主机的容器,从而实现了外部网络对service的访问。
微服务架构的应用由若干service组成。比如有运行httpd的web前端,有提供缓存的memcached,有存放数据的mysql,每一-层都是swarm的一个service,每个service运行了若干容器。在这样的架构中,service 之间是必然要通信的。
服务发现
一种实现方法是将所有service都publish出去,然后通过routing mesh访问。但明显的缺点是把memcached和mysql也暴露到外网,增加了安全隐患。
如果不publish,那么swarm就要提供一种机制,能够:
1.让service通过简单的方法访问到其他service。
2.当service副本的IP发生变化时,不会影响访问该service的其他service.
3.当service的副本数发生变化时,不会影响访问该service的其他service。
创建overlay网络
[root@node1 ~]# docker network create --driver overlay net_1
[root@node1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
100150b1cb1d bridge bridge local
1d3fe2287fd3 composetest_default bridge local
b71b7d52e7cc docker_gwbridge bridge local
ecda711e303a host host local
sybswth8yasg ingress overlay swarm
8823596e675a lnmp_default bridge local
vl2qc78nshem net_1 overlay swarm
18bdb4a24230 none null local
部署 service 到 overlay
[root@node1 ~]# docker service create --name web_server --replicas=3 --network net_1 192.168.19.130:5000/httpd
部署一个 util 服务用于测试,挂载到同一个 overlay 网络
[root@node1 ~]# docker service create --name util --network net_1 192.168.19.130:5000/busybox sleep 10000000
sleep 1000000 的作用是保持 busybox 容器处于运行的状态,我们才能进入到容器里面访问web_server
验证
查看 util 所在的节点
[root@node1 ~]# docker service ps util
登录到相应的节点,在容器 util.1中 ping web_server
[root@node2 ~]# docker exec util.1.vyoiw65kflu6gewdd5mbm2z95 ping -c 3 web_server
镜像使用httpd2.2,然后将其更新到 httpd2.4
启动httpd:2.2
[root@node1 ~]# docker service create --name my_web --replicas=3 httpd:2.2
更新到httpd:2.4
[root@node1 ~]# docker service update --image httpd:2.4 my_web
[root@node1 ~]# docker service ps my_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xf2sxnn2ad1y my_web.1 192.168.19.130:5000/httpd:2.4 node1 Running Running 2 minutes ago
klxm2fn5knrr my_web.2 192.168.19.130:5000/httpd:2.4 node2 Running Running 2 minutes ago
dnvm2hfu5s9s my_web.3 192.168.19.130:5000/httpd:2.4 node3 Running Running 2 minutes ago
Swarm将按照如下步骤执行滚动更新:
1.停止第一个副本
2.调度任务,选择 worker ndoe。
3.在 worker 上用新的镜像启动副本。
4.如果副本(容器)运行成功,继续更新下一个副本,如果失败,暂停整个更新过程。
默认配置下,Swarm 一次只更新一个副本,并且两个副本之间没有等待时间。我们可以通过- -update-parallelism设置并行更新的副本数目,通过- -update-delay指定滚动更新的间隔时间。
比如执行如下命令:
[root@node1 ~]# docker service update --replicas=6 --update-parallelism 2 --update-delay 1m30s web_server
每次更新两个副本,并且等待时间为1分30秒
查看 service 的当前配置:
[root@node1 ~]# docker service inspect --pretty web_server
Swarm 还有个功能回滚,如果更新后效果不理想,可以通过 - -rollback 恢复到前一次的状态
[root@node1 ~]# docker service update --rollback my_web
my_web
rollback: manually requested rollback
overall progress: rolling back update: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
注意:- -rollback 只能回滚到上一次执行 docekr service update 之前的状态,并不是无限制回滚。
[root@node1 ~]# docker service create --name my_web1 --mode global 192.168.19.130:5000/httpd
6d9bd46b902e46ffe5096608c
overall progress: 3 out of 3 tasks
wl9tv3om7ubb: running
hv3mxu6u7l7e: running
35rbxdx15fmi: running
verify: Service converged
查看信息
[root@node1 ~]# docker service inspect --pretty my_web1
Name: my_web1
Service Mode: Global
为每个节点定义label:
[root@node1 ~]# docker node update --label-add env=test node2
node2
[root@node1 ~]# docker node update --label-add env=test1 node3
node3
创建服务全部放在labels=test上
[root@node1 ~]# docker service create --name my_web2 --replicas 3 --constraint node.labels.env==test httpd
9qtdv8by3r3zgimnjkrwqdcku
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
[root@node1 ~]# docker service ps web2
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
zgimnjkrwqdq my_web2.1 httpd:latest node2 Running Running 18 seconds ago
8byzginjkcuu my_web2.2 httpd:latest node2 Running Running 18 seconds ago
9y3r3mnjwdku my_web2.3 httpd:latest node2 Running Running 18 seconds ago
更新迁移 service
[root@node1 ~]# docker service update --constraint-rm node.labels.env==test my_web2
[root@node1 ~]# docker service update --constraint-add node.labels.env==test1 my_web2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。