Docker Swarm实现服务的滚动更新的示例代码
一、什么是Docker Swarm?
Docker Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
二、Docker Swarm的体系架构
这个图作为一个整体实际上都处于一个所谓的集群中,它可能对应了一到多台的实际服务器。每台服务器上都装有Docker并且开启了基于HTTP的DockerAPI。这个集群中有一个SwarmManager的管理者,用来管理集群中的容器资源。管理者的管理对象不是服务器层面而是集群层面的,也就是说通过Manager,我们只能笼统地向集群发出指令而不能具体到某台具体的服务器上要干什么(这也是Swarm的根本所在)。至于具体的管理实现方式,Manager向外暴露了一个HTTP接口,外部用户通过这个HTTP接口来实现对集群的管理。对于稍微大一点的集群,最好是拿出一台实际的服务器作为专门的管理者,作为学习而言,也可以把管理者和被管理者放在一台服务器上。
三、Docker Swarm服务的滚动更新
Docker Swarm可以实现服务平滑升级,即服务不停机更新,客户端无感知。下面我们通过一个具体的例子,来为大家演示。这里我们将部署一个基于nginx的web应用程序服务,部署在node节点上。我们将创建同一个应用的两个版本:version 1和 version 2
创建一个Dockerfile,并使用docker build进行编译。
FROM nginx RUN echo '<h1>Swarm:Version 1 <h1>' > /usr/share/nginx/html/index.html
注意:为了使得Swarm集群中的每个节点都能访问到镜像,我们这里把生成的镜像上传到自己的镜像仓库中。
docker login docker build -t collenzhao/mynginx:v1 . docker push collenzhao/mynginx:v1
创建Swarm的服务,即:通过镜像启动容器
docker service create -p 7788:80 --replicas 3 --name myswarmtest collenzhao/mynginx:v1
通过docker service ls查看部署的服务。
通过docker service ps myswarmtest查看部署服务的详细信息
效果如下图所示
更新之前的Dockerfile,注意版本号变为:2
FROM nginx RUN echo '<h1>Swarm:Version 2 <h1>' > /usr/share/nginx/html/index.html
使用docker build进行编译
docker build -t collenzhao/mynginx:v2 .
使用docker push上传到docker hub
docker push collenzhao/mynginx:v2
更新之前在Swarm部署的服务,版本号变成了2
docker service update --image collenzhao/mynginx:v2 myswarmtest
效果如下如所示