原文链接:http://www.dubby.cn/detail.html?id=8735
准备
- 已经安装好Docker 1.13或者以上的版本。
- 安装好Docker Compose。如果你是用的是Docker for Mac和Docker for Windows,那么不用担心,这是自带的。如果是Linux,那么需要你去安装了。如果是用的是Windows10的预览版,因为没有Hyper-V,所以你需要使用Docker Toolbox。
- 阅读完《Docker入门六部曲——容器》。
- 阅读完《Docker入门六部曲——基本引导》。
- 确保你的
friendlyhello
镜像已经被push到注册中心了。我们会在这一篇文章中用到。 - 确保你的镜像已经可以正常的部署。运行
docker run -p 80:80 username/repo:tag
(我的是docker run -p 80:80 dubbyyoung/get-started:part1
,你要换成你自己的),然后浏览http://localhost/
。
介绍
这一篇文章,我们会伸缩我们的应用,并且开始负载均衡。为了达到这一目的,我们需要把目光提升一个层级:服务层。
- Stack(堆栈)
- Services(服务)——你正在看的
- Container(容器)
理解服务
在一个分布式应用中,这个应用的不同部分,被称为一个一个服务。例如,你在做一个视频分享网站,会包含这么几个服务,把数据存储到磁盘的服务,用户上传文件后的文件转换服务,给前端调用的一个服务等等。
服务其实就是在一个应用中的容器。“一个服务只运行一个镜像,但是,他会编排镜像的运行方式——使用那个端口,需要多少个副本(replicas,就是多个实例)才能满足需要,等等”。伸缩一个服务就是改变这一个服务的运行的容器的数量。
不用担心,有了Docker,这些都可以很容易实现,我们只需要定义好docker-compose.yml
就可以了。
你的第一个docker-compose.yml
docker-compose.yml
文件是一个YAML文件,定义了Docker容器的行为。
docker-compose.yml
version: "3"
services:
web:
# 使用你自己的username/repo:tag
image: dubbyyoung/get-started:part1
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "8000:80"
networks:
- webnet
networks:
webnet:
上面的docker-compose.yml
告诉Docker要这么做:
- 从注册中心把镜像拉取下来。
- 运行5个实例作为一个服务
web
,并且限制每个实例的CPU使用率最多只能到10%,内存最多使用50M。 - 一旦一个容器失败就重启。
- 把宿主机的
80
端口映射到web
这个服务的80
端口。 - 指示
web
服务里的所有容器通过一个负载均衡的网络webnet
来共享80
端口(在内部,这些容器自己会使用一个临时的端口来映射到web
服务的80
端口)。 - 把
webnet
网络作为默认网络设置。
想了解docker-compose.yml的一些其他知识吗?
看
version: "3"
,这个本质上是让它可以和Swarm mode兼容。只有在version>=3.x时,才可以用deploy,当然,没有deploy,更加不会有他的子选项;同样,只有在version>=3.x时,才可以用docker stack deploy
这个命令。当然,你的配置文件名不是必须是
docker-compose.yml
,这只是标准命名而已,你完全可以用有实际意义的命名来代替,比如docker-stack.yml
。
运行你的负载均衡应用
在执行docker stack deploy
之前,先需要执行:
docker swarm init
注意:这个命名的意义,在下一篇文章会介绍。如果你不执行这个,会报”this node is not a swarm manager.”的错误的。
现在可以运行了,给你的应用起个名字吧,我们不妨叫他getstartedlab
:
docker stack deploy -c docker-compose.yml getstartedlab
如果这个命令执行失败,不妨尝试着把端口改成8000:80。
然后使用这个命令来看你的五个容器:
docker stack ps getstartedlab
现在你可以访问localhost
(如果你的是8000:80,那就访问localhost:8000
)。随着你刷新页面,你还可以看到容器ID在不断变化,这也证明了是均在均衡。
注意:你访问页面大概需要30秒钟,这不是Docker性能差,而是因为没有Redis,这个在之后我们会解决的。
伸缩你的应用
你可以修改你的docker-compose.yml
中的replicas
数量,保存之后,在使用docker stack deploy
命令:
docker stack deploy -c docker-compose.yml getstartedlab
Docker会自动更新,不需要你手动的下容器或者手动的kill。
现在使用docker stack ps
,你可以看到伸缩之后的容器数量。
下掉你的应用
下掉应用的命令是docker stack rm
:
docker stack rm getstartedlab
这个命令会把你的应用移除,不过在我们的单节点的swarm依然是运行中(可以使用docker node ls
查看)。可以使用docker swarm leave --force
来关闭swarm。
相信你也觉得使用Docker来伸缩你的应用还是很简单的。看到这里,你的Docker使用已经很接近生产使用了。下一步,我们会学习如何把你的应用部署在集群的Docker机器上。