Docker Swarm概念与基本用法

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

ingress network

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

原文来自:https://note.qidong.name/2018/11/docker-swarm/做者:匿蟒

相关文章
相关标签/搜索