3. Services

3. Services

介绍

在本部分,我们伸缩我们的应用,并且完成负载均衡功能。为了完成这个,我们必须在前面提到的层级结构中上移一层:service。

  • stack
  • service
  • container

什么是服务?

在一个分布式应用中,应用的不同功能部分被称为服务。例如如果你想像一个视频分享网站,它可能包含存储数据在数据库的服务,视频转码的后台服务以及前段用户上传视频的服务。

在docker情景中,简单来说__服务就是生产环境中运行的容器__。一个服务仅仅运行一个镜像,但是它组织镜像如何运行,使用哪个端口,运行多少个副本等等。伸缩一个服务,仅仅需要指定更多的计算资源到每个进程中的服务,从而改变容器实例的数量。

在docker平台上,很容易定义、运行和伸缩服务,通过使用docker-compose.yml文件。

docker-compose.ymls文件

一个docker-compose.yml文件是一个YAML文件,用来定义生产环境中容器的运行方式。

新建一个docker-compose.yml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: dockerjie/get-started:part2
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:

上面的docker-compose.yml文件描述了:

  • 从什么地方去拉取需要的镜像文件
  • 运行含有5个实例的镜像作为一个web服务,限制每个实例使用的cpu比例和内存大小
  • 重启策略:如果容器fail,立即重启该容器。
  • 端口映射:宿主机的4000端口到容器的80端口
  • 构建web服务的容器们共享80端口,通过一个被称为webnet的负载均衡的网络。
  • 使用默认配置定义webnet网络。

运行可负载均衡的app

在使用docker stack deploy命令之前,先运行:

1
docker swarm init

image.png | left | 681x102

现在运行app

1
docker stack deploy -c docker-compose.yml getstartedlab

这个服务stack正在一个宿主机上运行我们部署的镜像的5个容器实例。

查看服务列表:

1
docker service ls

image.png | left | 681x39

上面的输出是关于web服务的信息,分别是服务ID,服务名字,模式,副本的数量,镜像以及暴露的端口信息。

运行服务里面的单个容器叫做task。每一个task有一个递增的数字ID。

列出服务包含的tasks。

1
docker service ps getstarted_web

image.png | left | 681x60

同样的查看容器列表也能观察到web服务包m含的task:

1
docker container ls

image.png | left | 681x65

测试效果:

image.png | left | 681x192

image.png | left | 681x171

可以看到每次访问对应的hostname都不相同,因此部署的web服务已经具有负载均衡的能力。

扩容on-the-fly

修改docker-compose.yml文件中的replicas的值,重新运行:

1
docker stack deploy -c docker-compose.yml getstartedlab

image.png | left | 681x49

docker执行一个in-place的更新,没必要停止stack或者停止任何容器。

现在重新查看容器列表:

1
docker container ls -q

image.png | left | 681x203

同样的,如果我们扩容了,除了容器增加了,服务包含的task也会相应的增加。

停止app和swarm

  • 停止app
1
docker stack  rm getstartedlab

image.png | left | 636x108

  • 停止swarm
    1
    docker swarm leave --force

image.png | left | 576x76

使用Docker很容易构建app和扩缩容。

1
2
3
4
5
6
7
8
docker stack ls                                            # List stacks or apps
docker stack deploy -c <composefile> <appname> # Run the specified Compose file
docker service ls # List running services associated with an app
docker service ps <service> # List tasks associated with an app
docker inspect <task or container> # Inspect task or container
docker container ls -q # List container IDs
docker stack rm <appname> # Tear down an application
docker swarm leave --force # Take down a single node swarm from the manager