阅读本文前需要先理解什么是Docker image和container,并熟悉相关的基本命令。根据Docker官方文档和自己的理解,将自己学习过程中遇到的几个关联概念做了笔记。

用Docker管理Scalable App

Web端的app通常由多个不同部分的功能组成,需要能够按照用户数量动态扩展使用的资源,可以将docker化的App运行到docker swarm中,实现负载均衡。

为了理解相关概念,让我们先创建一个swarm:

$ docker swarm init

1. App && Stack

一个App通常由多个不同的功能部分组成,我们可以将这些部分分成相对独立的功能单元,这些功能单元可以实现成不同的docker services。

一个Stack是一组相互关联的services,这组service共享依赖,可被安排在一起运行和扩展。App根据复杂程度,可以使用a single stack或者multiple stacks.

App可以通过编排好的docker-compose.yml文件启动运行到swarm中:

$ docker stack deploy -c docker-compose.yml <app-stack>

# 查看所有stack(NAME, SERVICES数量,ORCHESTRATOR e.g. Swarm)
$ docker stack ls

# 删除stack
$ docker stack rm <app-stack>

2. Service

docker-compose.yml是一个YAML格式的文件,定义了生产环境(in production)中的Docker container行为,通过该文件对services定义、运行、扩容。

Services实际上是"containers in production". 一个service只能运行一个image,但是可以运行出同一个image的多个containers。A service is the definition of the tasks to execute on the manager or worker nodes. 用service模式运行一个container和独立运行container相比,可以在不手工重启container状况下,通过service更新container的网络、volume等配置.

# 查看当前运行的service
$ docker service ls

# 查看某个stack的所有service
$ docker stack services <app-stack>

Service在Swarm中有两种运行模式:

  • replicated services model: the swarm manager distributes a specific number of replica tasks among the nodes based upon the scale you set in the desired state.
  • global services: the swarm runs one task for the service on every available node in the cluster.

3. Task && Container

A task is analogous to a “slot” where the scheduler places a container, 是swarm中的原子调度单元,对应运行在一个service中的单个container(理论上Task也可以对应到非container的执行单元如进程上,但是目前只对应container)。每个task在service中被分配了一个唯一的数字ID,从1一直到service设置的replicas数。每个Task中有一个对应的container。

# 查看特定service下的所有task
$ docker service ps [--no-trunc] <service-name>

# 查看所有运行container信息,docker ps或docker container ls
# 查看所有container的数字ID
$ docker container ls -q

# 查看特定service的所有container
$ docker ps --filter name=<service-name>
# 查看特定service的所有container ID
$ docker ps --filter name=<service-name> -q

# 在特定的service container上执行linux命令
$ docker container exec $(docker ps --filter name=<service-name> -q) ls -l /

4. Swarm Cluster

  • Swarm: “Dockerized” cluster,一组运行Docker并被加入到一个Cluster中的机器。machine (物理的或虚拟的)加入swarm后才会变为该swarm的一个node.
  • A node is an instance of the Docker engine participating in the swarm. 在一台物理机或云端服务器上可以运行多个node.
# enable swarm mode and make current machine a swarm manager
$ docker swarm init
$ docker swarm leave --force

# execute on worker machine
$ docker swarm join
$ docker swarm leave

利用Virtualbox虚拟机创建swarm,myvm1作为swarm manager,myvm2作为worker:

# create virtual machine2 with Virtualbox (Not on Win 10)
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2

# check the status of machines, 连接上的机器后有一个*号asterisk
docker-machine ls

# restart a machine that's stopped, run
docker-machine start <machine-name>

docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"

# 查看swarm中的nodes状态
docker-machine ssh myvm1 "docker node ls"

配置当前shell与swarm manager中的Docker daemon通讯:

docker-machine env myvm1
eval $(docker-machine env myvm1)

# unsetting docker-machine shell variable settings
eval $(docker-machine env -u)

关系小结

Reference

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐