docker swarm(一) 入门 -- 搭建一个简单的swarm集群

概述

Docker Swarm是容器的集群管理工具。它的主要特性:

  • 集成于Docker Engine的集群管理工具。
  • 分布式设计。从一个image生成整个集群。一个docker swarm下的不同node,可以分布于同一,或不同的物理设备上。
  • 灵活调度。按需启动或关闭容器。
  • 高可用性。支持监控容器状态,如果容器崩溃,可以自动重启容器。
  • 支持多样的网络配置。支持overlay、macvlan、bridge、host等网络形式。
  • 服务发现。
  • 负载均衡。
  • 加密传输。默认基于TLS实现容器间的交互,实现加密传输。
  • 升级回退。支持动态升级容器,如果升级后的容器运行不正常,可自动回退到上一版本。

主要概念

node(节点)

每个docker node都是docker engine的实例(可以理解成,每个docker node即是安装了docker环境的PC),可分为manager和worker两类。

  • manager node:
    • 给worker nodes分配任务(task)。
    • 识别worker nodes的状态,调度容器。


  • worker node
    • 执行manager mode分配的任务(task)。

service(服务)与task(任务)

Docker Swarm通过一个YAML格式的文件,定义了生产环境(in production)中的Docker container行为。此文件包含对services定义、运行、扩容。

service可以理解为是"containers in production"。它是一个swarm系统中最关键的定义。 一个service只能运行一个image,但是可以运行出同一个image的多个containers。

一个task是swarm调度的最小单位,它运行于manager或worker nodes上。它即对应service中的一个container实例。它包含: 一个container container启动后运行的指令

搭建一个Docker Swarm

环境准备

准备两个虚拟机,一个作为manager,一个作为worker。两个虚拟机间能ping通。并且要求以下端口开放访问:2377,2946。

创建Swarm

在manager设备上,创建swarm,同时配置一下manager的ip。

$ docker swarm init --advertise-addr 192.168.154.135
Swarm initialized: current node (78ayx9kk6n3qr4gcn05nmuvzg) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-523lnlcl8xbol5hmg4aab6ur2g2flmdx5zxb31qzj8r8ty0mbo-bhfp0yf7er2vysftf753s3rz5 192.168.154.135:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

通过docker info确认一下swarm已经创建。

$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 5
  Running: 0
  Paused: 0
  Stopped: 5
...
 Swarm: active
  NodeID: 78ayx9kk6n3qr4gcn05nmuvzg
  Is Manager: true
  ClusterID: ommhsz8xug6ltvauyusfn3vsp
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
...

通过docker node ls确认docker node信息。

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
78ayx9kk6n3qr4gcn05nmuvzg *   ubuntu              Ready               Active              Leader              19.03.5

把worker nodes加入swarm

在上一步创建swarm时,docker提示了加入此swarm应执行的命令。在worker node上执行这些命令。

$  docker swarm join --token SWMTKN-1-523lnlcl8xbol5hmg4aab6ur2g2flmdx5zxb31qzj8r8ty0mbo-bhfp0yf7er2vysftf753s3rz5 192.168.154.135:2377
This node joined a swarm as a worker.

如果你没有记录下这个加入swarm的命令,可以在manager node上执行docker swarm join-token worker以重新获取命令。

再回到manager节点上,查看当前swarm的成员。

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
78ayx9kk6n3qr4gcn05nmuvzg *   ubuntu              Ready               Active              Leader              19.03.5
lugs1vyy3o6z3dvnpytkxf6yi     ubuntu              Ready               Active                                  19.03.5

创建并部署一个service

在manager节点上,创建一个service。

docker service create --replicas 1 --name helloworld alpine ping docker.com

参数解释:

  • --replicas:service运行的实例个数
  • --name: 命名service为helloword
  • alpine ping docker.com: 定义此service为,在 Alpine Linux容器中,执行ping docker.com

docker service ls确认一下:

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
uyxa5ye0061k        helloworld          replicated          1/1                 alpine:latest

在执行了docker service create之后,此service即是已经被拆解成task执行了。通过以下命令可以查看它的执行状态。这里不具体展开了。

docker service inspect --pretty <SERVICE-ID>
docker service ps <SERVICE-ID>

docker ps可以查看在当前node上执行的task。此service当前在manager node上执行。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a1f880ea0a72        alpine:latest       "ping docker.com"   16 minutes ago      Up 15 minutes                           helloworld.1.crxx3hwti4wmj5p6zyqe8yi03

service缩容与扩容

docker service scale可以修改一个serivce衍生出的副本数量,也就是task数量。通过以下命令将helloworld扩容到5个task。

$ docker service scale helloworld=5
helloworld scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged

查看service在各nodes上的运行情况

$ docker service ps helloworld
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
crxx3hwti4wm        helloworld.1        alpine:latest       ubuntu              Running             Running 55 minutes ago                           
1kej5h5qmkvt        helloworld.2        alpine:latest       ubuntu-2            Running             Running about a minute ago                       
u7i09cvrv7sj        helloworld.3        alpine:latest       ubuntu-2            Running             Running about a minute ago                       
glipqhq70jo7         \_ helloworld.3    alpine:latest       ubuntu-2            Shutdown            Shutdown 8 minutes ago                           
x9qkewnqf2fa        helloworld.4        alpine:latest       ubuntu              Running             Running about a minute ago                       
vwkke0hvmxk8         \_ helloworld.4    alpine:latest       ubuntu-2            Shutdown            Shutdown 8 minutes ago                           
dsyijxuant14        helloworld.5        alpine:latest       ubuntu-2            Running             Running about a minute ago                       
ku0o7qg243tl         \_ helloworld.5    alpine:latest       ubuntu-2            Shutdown            Shutdown 8 minutes ago

删除service

执行docker service rm删除service。

$ docker service rm helloworld
helloworld

若干秒后,此service衍生出的task也都停止运行。

$ docker service ps helloworld
no such service: helloworld


最后,欢迎访问小耸的博客#docker系列教程

编辑于 02-11

文章被以下专栏收录