上一篇我们讲到Docker Compose可以定义和运行多容器应用程序,用一个YAML配置文件来声明式管理服务,在一台安装了Docker engine的Linux系统上可以很好的工作,但是现实中不可能只有一台Linux系统,一台Linux系统不可能有足够的资源运行所有的云原生应用系统,为了支撑整个业务平台,势必要在很多台Linux系统运行云原生应用系统,共同组成一个容器集群,Docker Compose工具并不能管理这样的容器集群,势必有新工具出现。
开源界管理容器集群的系统一般叫作容器编排系统,主要有三个系统:Docker Swarm、Mesos、Kubernetes。当然众所周知,Mesos背后的支撑公司已经出现了问题,Docker Swarm也是有气无力的状态,只有Kubernetes如日中天,成为事实上的标准。
既然Kubernetes是事实上的标准,为什么四年前我还是选择了Docker Swarm?基于简单的三个理由:
所以我推荐选择Docker Swarm而不是K8s,如果你的真实系统环境和我差不多的话,不要给公司运维人员带来额外的技术债务。
从Docker Engine 1.12版本开始,Docker Swarm已经包含在其中了,负责容器集群管理和编排。下面列举一下Docker Swarm有哪些特性:
Docker Swarm有几个关键概念需要我们明白:
Swarm支持多个管理节点,管理节点负责处理集群的管理任务:1)维护集群状态;2)调度服务;3)提供Swarm模式HTTP API端点服务。工作节点就是执行服务的任务。
上图阐述了服务、任务和容器的协作关系,服务service有多个replicas,分派成多个task去执行,task在container里去执行。
副本服务就是指定了多少副本,就会执行多少个任务和运行容器,一般我们的业务系统服务就是采用这种方式的。
全局服务是每个节点运行一个任务,不需要预先指定副本,每次你添加一个新节点进入Swarm集群,新节点也会被分派执行一个任务,这种服务一般是监控代理、杀毒扫描等服务。
我们要部署一个应用程序到Swarm集群,一般的操作步骤是:
2377
TCP for communication with and between manager nodes;7946
TCP/UDP for overlay network node discovery;4789
UDP (configurable) for overlay network traffic。在管理节点执行:
$ docker swarm init --advertise-addr
例如:
$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
查看swarm当前状态:
$ docker info
查看swarm节点情况:
$ docker node ls
在你规划的各个worker node上执行:
$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377This node joined a swarm as a worker.
如果你不记得token了,则去管理节点去执行:
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
在管理节点上执行:
$ docker service create --replicas 1 --name helloworld alpine ping docker.com
9uk4639qpg7npwf3fn2aasksr
docker service create
: 创建服务命令.--name
:服务名 helloworld
.--replicas :指定副本数量,即运行任务的容器数量
.alpine ping docker.com:alpine是镜像,执行任务命令是:
ping docker.com
.查看运行中的服务命令:
$ docker service ls
ID NAME SCALE IMAGE COMMAND
9uk4639qpg7n helloworld 1/1 alpine ping docker.com
探查一个服务情况执行:
$ docker service inspect --pretty
$ docker service ps
$ docker service scale
= 例如:
$ docker service scale helloworld=5
helloworld scaled to 5
$ docker service ps helloworld
$ docker service rm helloworld
helloworld
采用docker service create 命令部署一个服务太麻烦,太多参数需要自己手工在命令行指定,不是高效的做法,最终我们还是要用docker-compose.yml来定义一切参数,一个简单命令来提交是最好的。
假如我们已经做好了几件事情:
使用docker stack deploy命令来执行,stack名为stackdemo:
$ docker stack deploy --compose-file docker-compose.yml stackdemo
Ignoring unsupported options: build
Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis
使用docker stack services命令来执行,指定stack名:
$ docker stack services stackdemo
ID NAME MODE REPLICAS IMAGE
orvjk2263y1p stackdemo_redis replicated 1/1 redis:3.2-alpine@sha256:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86d
s1nf0xy8t1un stackdemo_web replicated 1/1 127.0.0.1:5000/stackdemo@sha256:adb070e0805d04ba2f92c724298370b7a4eb19860222120d43e0f6351ddbc26f
如果你不需要这个stack,则删除它,执行docker service rm:
$ docker stack rm stackdemo
Removing service stackdemo_web
Removing service stackdemo_redis
Removing network stackdemo_default
我基本上是按照这个地址来学习操作的,篇幅不大,耐心阅读完就够了,无须阅读其它二手资料:Swarm mode overview | Docker Docs。
命令参考手册地址:docker swarm | Docker Docs
Docker Swarm 是 Docker 官方推出的容器编排工具,不同于Docker Compose 是一个在单个服务器或主机上创建多个容器的工具, Docker Swarm 是在多个服务器或主机上创建容器集群服务,对于微服务的部署,自然 Docker Swarm 才是解决之道。
对于中小公司的小型云原生应用系统而言,选择Docker Swarm可能更为适合,适合才是最好的,系统架构师需要根据公司实际情况进行慎重选择。