Docker Swarm是Docker公司开发的容器集群管理服务。 从1.12.0版本开始,已是Docker安装后自带的一部分(捆绑软件)了,又称为Swarm Mode,无需额外安装。node
与Kubernetes相比,Docker Swarm
是一个简单的软件,彷佛不堪大用。 可是它与docker-compose兼容的优势,能够弥补一切。 对于没有集群使用经验的小白,用Docker Swarm起步,是一个很好的选择。docker
概念
Docker Swarm,主要包含如下概念:网络
- Swarm
- Node
- Stack
- Service
- Task
- Load balancing
Swarm自己就是“群”的意思,人群、蜂群。 这里就是指计算机集群(cluster)在用Docker链接后的状态。 docker swarm命令能够建立、加入、离开一个集群。负载均衡
Node就是计算机节点,也能够认为是一个Docker节点。 Node分为两类:Manager和Worker。 一个Swarm至少要有一个Manager,部分管理命令只有在Manager上才能使用。 两类Node均可以运行Service,但只有Manager上才能执行运行命令。 好比,在Manager才能使用docker node命令能够查看、配置、删除Node。ide
Stack是一组Service,和docker-compose相似。 默认状况下,一个Stack共用一个Network,相互可访问,与其它Stack网络隔绝。 这个概念只是为了编排的方便。 docker stack命令能够方便地操做一个Stack,而不用一个一个地操做Service。this
Service是一类容器。 对用户来讲,Service就是与Swarm交互的最核心内容。 Service有两种运行模式,一是replicated,指定一个Service运行容器的数量; 二是global,在全部符合运行条件的Node上,都运行一个这类容器。 docker service命令能够操做Swarm中的Service。spa
Task就是指运行一个容器的任务,是Swarm执行命令的最小单元。 要成功运行一个Service,须要执行一个或多个Task(取决于一个Service的容器数量),确保每个容器都顺利启动。 一般用户操做的是Service,而非Task。代理
Load balancing即负载均衡,也包含反向代理。 Swarm使用的是Ingress形式的负载均衡,即访问每一个节点的某个Published端口,均可自动代理到真正的服务。 大体原理以下图所示。code
Replicated Mode
services: some-serivce: ... deploy: mode: replicated replicas: 3
默认状况下,mode就是replicated,因此这行能够省略。 默认replicas数目为1,表明这个Service只启动1个容器。 这个模式,能够按需启动多个服务,Swarm会自动调节,有时一个Node会启动多个容器。blog
Global Mode
services: some-serivce: ... deploy: mode: global placement: ...
全部可部署的Node,都部署一个。 经过placement,能够限定知足条件的Node,而避免在不合适的Node进行部署。
操做
这里列出一些经常使用的具体操做。
建立第一个Node
docker swarm init --advertise-addr $IP
$IP
是当前Node的外部可访问IP,便于其它Node寻址。
这样,一个Swarm就被初始化完成了,它仅有一个Manager节点。
添加新的Node到Swarm
在Manager节点,执行如下命令可查看到如何加入一个Node:
$ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-2zspelk468gb6wgw5adea4wlbw4kfy3q1uhr86zpafl9m5a3ho-ezs4fylj526e801b3cl0pojr5 10.174.28.52:2377 $ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2zspelk468gb6wgw5adea4wlbw4kfy3q1uhr86zpafl9m5a3ho-164iqklrfv8o3t55g088hylyk 10.174.28.52:2377
在一个未加入任何Swarm的机器上,执行以上显示的命令docker swarm join --token ...
, 便可成为这个Swarm的Manage或Worker节点。
设置节点Label
在Manager节点,能够对任意节点设置标签:
docker node update $node_name --label-add main=true
$node_name
就是要设置节点的ID或HOSTNAME。 Label是键值对形式,main=true
中的main就是键、true就是值。
设置了Label之后,在Compose文件中就能够用placement中的constraints来对可用节点做出限制。
services: some-serivce: ... deploy: placement: constraints: - node.labels.main == true ...
以上配置,让some-service仅在Label被设置为main=true的节点,才能使用。
启动、中止服务
docker stack deploy $stack_name -c docker-compose.yaml -c other.yaml ...
$stack_name
是Stack名称。 能够用-c指定多个docker-compose文件,也可在相同Stack下分批次deploy多个文件。 这些YAML文件的写法,和原先用docker-compose命令执行的没有本质区别,只是多加了如下独特配置,而且会忽略一些Swarm场景下不支持的配置。
推荐使用docker-compose文件来编排Stack,而非直接用docker service create来手工建立。 详细配置项,可参考《Compose file version 3 reference | Docker Documentation》。
须要中止Stack的全部服务时,能够执行如下命令。
docker stack rm $stack_name
更新已运行服务的镜像
docker service update --image $image:$tag $service_name