本篇笔记是官方Get Started入门教程的Part3 Services,主要演示如何使用 docker-compose.yml 来定义应用服务,docker-compose 可以很方便地对 app 进行调整,并且很容易地实现负载均衡。
我正在学习Docker容器技术,相关笔记汇总在Docker容器技术 学习笔记汇总
本系列笔记作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/
安装Docker 1.13或更高版本。
安装Docker Compose,在 Docker for Mac 和 Docker for Windows 平台上,都是预装了,linux 系统的话就需要直接安装。
阅读第一步的基础知识。
了解Part2如何创建容器。
确保已将 friendlyhello 推送到 registry 仓库,我们将在这里使用它。
通过运行此操作并访问 http://localhost/ 来确保镜像正常工作:docker run -p 80:80 username/repo:tag
在 Part3 中,我们调整了应用程序容量,并启用了负载均衡。为此,我们必须在分布式应用程序的层次结构中研究更高一层的东西:Services。
Stack
Services (你正在这里)
Container (请看入门教程 Part2)
在分布式应用程序中,应用程序的不同部分称为“Services”。例如,你想做一个视频共享站点,则可能存在 将应用程序数据存储到数据库的服务,用户上传东西后的后台视频转码的服务,以及前端服务等等。
服务就是“生产环境中容器”。一个服务只运行一个镜像,但它定义了镜像运行的方式 - 应该使用哪些端口,应该运行多少容器副本因此服务也有容量要求,等等。 扩展服务会更改运行该软件的容器实例数量,并为该过程中的服务分配更多的计算资源。
幸运的是,使用Docker平台定义,运行和扩展服务非常简单 - 只需编写一个docker-compose.yml文件。
docker-compose.yml 文件是一个YAML文件,用于定义 Docker 容器在生产过程中的行为。
docker-compose.yml
将此文件另存为 docker-compose.yml,存在任意地方。确保已将创建的镜像按照第2步推送到 registry 仓库,并使用这个 .yml 文件而不是 username/repo:tag 来描述镜像细节:
version: "3"
services:
web:
image: username/repo:tag
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:
这个 docker-compose.yml 文件告诉Docker执行以下操作:
在我们可以使用docker stack deploy命令之前,我们先运行:
docker swarm init
注意:我们将在 Part4 中介绍该命令的含义。如果不运行 docker swarm init,你将收到一个错误提示“this node is not a swarm manager”。
现在我们来运行它.你必须给你的应用程序一个名字 - 这里设置为 getstartedlab:
docker stack deploy -c docker-compose.yml getstartedlab
我们的 service stack 在主机上运行了镜像的5个实例。让我们来研究下。
在 service 中获取 service ID。
docker service ls
你会看到以你的 app 名字为前缀的 web service。如果你按照示例中的命名,那你会看到名字是 getstartedlab_web。同时也会列出 service ID、副本数量、镜像名以及暴露端口。
Docker swarms run tasks that spawn containers. Tasks have state and their own IDs. Let’s list the tasks:
docker service ps
Note: Docker’s support for swarms is built using a project called SwarmKit. SwarmKit tasks do not need to be containers, but Docker swarm tasks are defined to spawn them.
Let’s inspect one of these tasks, and limit the output to container ID:
docker inspect --format='{
{.Status.ContainerStatus.ContainerID}}'
Vice versa, you can inspect a container ID, and extract the task ID.
首先运行 docker container ls 来获得容器ID,然后:
docker inspect --format="{
{index .Config.Labels \"com.docker.swarm.task.id\"}}"
现在列出了所有5个容器:
docker container ls -q
你可以续多次运行 curl -4 http://localhost 或者在浏览器中转到该URL,并点击刷新几次。
无论哪种方式,可以看到容器ID发生变化,这就是负载均衡;随着每次请求,从五个副本中轮询选择一个来进行响应。容器ID会和之前 (docker container ls -q) 命令得到的结果相一致。
twowinter注:Round Robin (轮询调度) 是一种以轮询的方式依次将一个域名解析到多个IP地址的调度不同服务器的计算方法。
你可以调整 app ,通过更改 docker-compose.yml 中的 replicas 值,保存更改并重新运行 docker stack deploy 命令:
docker stack deploy -c docker-compose.yml getstartedlab
Docker将进行就地更新,无需关掉 stack 和 任何容器。
现在,重新运行 docker container ls -q,将会看到部署实例重新配置了。如果你是增加副本,将会启动更多的tasks、hence、容器。
docker stack rm getstartedlab
docker swarm leave --force
这样就移除了 swarm,这样做的目的是为了准备下一步操作时能有个纯净的状态,具体是你用相同的命令行shell直接再创建一个 swarm。保证 Docker 主机会清晰地知道你正在使用哪个 swarm。
使用 Docker 来给 app 增减容变得特别方便。现在你已经大体掌握了如何将容器运行于生产环境。接下来你会学习如何利用 Docker 机器集群 上的 bonafide swarm 来运行你的app。
注意:Compose files 可用于使用Docker定义应用程序,并可以使用 Docker Cloud 上传到云提供商,也可以使用Docker Enterprise Edition选择的任何硬件或云提供商。