理解Docker Swarm, Service和Task
阅读本文前需要先理解什么是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中:(大金是single stack)
$ 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)
由此图可以知道,只要安装了docker, 初始化了swarm,即 $ docker swarm init,即可使用 $ doccker stack 命令
源网址:https://blog.csdn.net/legenddcr/article/details/79288241