当前位置:   article > 正文

Docker-swarm_docker swarm 创建httpd容器

docker swarm 创建httpd容器

如何访问 Services

部署web_server

[root@node1 ~]# docker service create --name web_server --replicas=2 192.168.19.130:5000/httpd
  • 1

启动了一个容器,是 web_server 的一个副本,容器监听了80 端口,但是并没有映射到 Docker host,所以只能通过容器的IP访问。

查看一下IP

[root@node1 ~]# docker inspect b6604d0c0469
"IPAdderss":"172.17.0.4",
  • 1
  • 2

进行访问:

[root@node1 ~]# curl 172.17.0.4
<html><body><h1>It works!</h1></body></html>
  • 1
  • 2

从外网访问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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

routing mesh

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的访问。

Services 之间通信

微服务架构的应用由若干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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

部署 service 到 overlay

[root@node1 ~]# docker service create --name  web_server --replicas=3 --network net_1 192.168.19.130:5000/httpd
  • 1

部署一个 util 服务用于测试,挂载到同一个 overlay 网络

[root@node1 ~]# docker service create --name util --network net_1 192.168.19.130:5000/busybox sleep 10000000
  • 1

sleep 1000000 的作用是保持 busybox 容器处于运行的状态,我们才能进入到容器里面访问web_server

验证

查看 util 所在的节点

[root@node1 ~]# docker service ps util
  • 1

登录到相应的节点,在容器 util.1中 ping web_server

[root@node2 ~]# docker exec util.1.vyoiw65kflu6gewdd5mbm2z95 ping -c 3 web_server
  • 1

如何滚动更新 Service(Rolling Update)

镜像使用httpd2.2,然后将其更新到 httpd2.4

启动httpd:2.2

[root@node1 ~]# docker service create  --name  my_web --replicas=3 httpd:2.2
  • 1

更新到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                             
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

每次更新两个副本,并且等待时间为1分30秒

查看 service 的当前配置:

[root@node1 ~]# docker service inspect --pretty web_server
  • 1

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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意:- -rollback 只能回滚到上一次执行 docekr service update 之前的状态,并不是无限制回滚。

Replicated mode 与 Global mode

[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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

查看信息

[root@node1 ~]# docker service inspect --pretty my_web1
Name:        my_web1
Service Mode:    Global    
  • 1
  • 2
  • 3

为每个节点定义label:

[root@node1 ~]# docker  node   update  --label-add   env=test    node2
node2
[root@node1 ~]# docker  node   update  --label-add   env=test1   node3
node3
  • 1
  • 2
  • 3
  • 4

创建服务全部放在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        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

更新迁移 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
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/483604
推荐阅读
相关标签
  

闽ICP备14008679号