Docker快速入门之服务

本文,我们会学习如何使用Docker来扩展应用程序以及如何实现负载均衡。因此,我们必须在分布式应用程序的层次结构中再深入上一层:服务层(从下到上可以概括为容器container=》服务services=》堆栈stack)。

 1.引言

在分布式应用程序中,应用程序的各个功能部分称为“服务”。比如,一个视频共享网站中,它可能包含一个用于在数据库中存储数据的服务、一个用于在后台进行视频转码的服务以及一个用于前端交互的服务等等。

服务实际上只是“生产环境中的容器”(Services are really just “containers in production.”)。一个服务只运行一个镜像,但是它规定了镜像的运行方式,比如,它应该使用什么端口、容器应该运行多少个副本来满足需求等。扩展服务是指您可以增加容器实例的数量,从而为该服务分配更多的计算资源。

对此,Docker可以通过编写docker-compose.yml文件,很容易的做到定义、运行以及扩展服务。

2.docker-compose.yml

docker-compose.yml文件定义了Docker容器在生产环境中应该如何工作。

首先,确定你已经将我们在前文创建的镜像上传到了注册表中了。然后创建如下所示的docker-compose.yml文件:

该docker-compose.yml文件会做以下工作:

(1)从注册表中提取镜像leo512/get-started:part2;
(2)运行该镜像的5个实例作为一个web服务运行,并且限制每个实例最多使用10%的CPU和50MB的内存空间;
(3)重启策略是:失败立即重启;
(4)将主机上的40000端口映射到web的80端口;
(5)指示web的容器通过称为webnet的负载均衡网络来共享80端口;
(6)使用默认设置定义webnet网络。

3.负载均衡示例

(1)首先,在运行docker stack deploy部署之前,您需要使用如下命令初始化swarm集群,否则可能会出错:

(2)接着,我们来运行它,并将应用程序命名为getstartedlab:

该服务栈在一台主机上运行了5个容器实例,获取容器id使用如下命令:

我们将运行在服务中的单个容器称为任务(task),每个任务会被赋予一个唯一的id。使用如下命令列出服务中的任务:

您也可以使用如下命令,列出此时运行的5个容器:

此时,您就可以通过url来访问您的应用程序了。由于开启了5个容器实例,所以当您不断刷新web页面时,该服务会选择5个任务中的某一个来响应您的请求。因此,您会发现页面中的Hostname字段对应的值是在不断变化的。

(3)扩展应用程序

您可以通过修改docker-compose.yml文件中replicas字段对应的值来改变应用程序中容器副本的值,达到扩展或缩小应用程序的目的。修改后需要重新运行docker stack deploy:

值得一提的是,Docker支持热更新,不需要您销毁堆栈(tear the stack down)或杀死任何容器就可以实现更新。

(4)关闭应用程序和集群

关闭应用程序:

关闭swarm集群:

 

参考:
https://docs.docker.com/get-started/part3/#scale-the-app

发表评论

电子邮件地址不会被公开。 必填项已用*标注