Docker 1.12 Swarm Mode初体验

2016-12-01 10:40:08
Swarm Mode是什么

Swarm Mode 直接集成于 docker engine 内部, 提供了原生的集群支持, 但与单机版 docker engine 并不兼容, 使用独立的 docker service 命令进行管理, 也无法使用单机版 Docker 的工具及 API,下面介绍几个基本概念

  • 节点(node)为Swarm集群中的一个docker engine实例。其中管理节点(manager node)负责swarm集群管理并向工作节点分配任务;工作节点(work node)接受并执行来自管理节点的task
  • 服务(service)是对在worker nodes所运行一组任务的定义,它是整个swarm的核心,一个service由多个任务组成
  • 任务(task)包含Docker容器和容器中运行的命令或应用,它是swarm中被调度的最小单元。简单可理解为一个task就是一个容器

Swarm Mode下主要使用三组新的命令行工具创建和管理一个Swarm集群

  • docker swarm:集群管理,子命令有init, join, leave, update
  • docker node: 节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm
  • docker service: 服务创建,子命令有create, inspect, update, remove, tasks
  • docker stack/deploy:试验特性,用于多应用部署, 类似与 docker-compose 中的特性
Swarm Mode特性
  • 去中心化设计
  • 声明式服务模型
  • 随意控制集群规模
  • 自动状态维护
  • 跨主机网络
  • 服务发现
  • 负载均衡
  • 默认tls加密
  • 滚动更新
创建Swarm集群
  • 准备工作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # rpm -ivh epel-release-7-2.noarch.rpm 
    # cat /etc/yum.repos.d/docker.repo
    [dockerrepo]
    name=Docker Repository
    baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
    enabled=1
    gpgcheck=1
    gpgkey=https://yum.dockerproject.org/gpg

    # yum install docker-engine -y
    # systemctl start docker
    # systemctl enable docker
    # docker version
  • 在node01上初始化swarm集群

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # docker swarm init --advertise-addr 192.168.1.102
    Swarm initialized: current node (1r64t4ljem9e4l2e8pnxx9p5o) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-457lrm2xagck8zy5ce9njycvybj9fsurgsh71ihhotol4ivtmj-ds0l8ld19esrbev349v6r4hd1 \
    192.168.1.102:2377

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

    以后如果查看token信息,可以执行 docker swarm join-token worker
    将node2添加到节点

    1
    2
    3
    4
    [root@node2 ~]# docker swarm join \
    --token SWMTKN-1-457lrm2xagck8zy5ce9njycvybj9fsurgsh71ihhotol4ivtmj-ds0l8ld19esrbev349v6r4hd1 \
    192.168.1.102:2377
    This node joined a swarm as a worker.

    再次查看node1节点信息

    1
    2
    3
    4
    [root@node1 ~]# docker node ls
    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    1r64t4ljem9e4l2e8pnxx9p5o * node1 Ready Active Leader
    e4ch01lolinm7g49tu38tfib3 node2 Ready Active
  • 在node1上建立服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [root@node1 ~]# docker service create --replicas 1 --name dv citizenstig/dvwa
    5zgu87rqr7k5ieg7la5so03j1
    [root@node1 ~]# docker service ls
    ID NAME REPLICAS IMAGE COMMAND
    5zgu87rqr7k5 dv 1/1 citizenstig/dvwa
    [root@node1 ~]# docker service inspect --pretty dv
    ID: 5zgu87rqr7k5ieg7la5so03j1
    Name: dv
    Mode: Replicated
    Replicas: 1
    Placement:
    UpdateConfig:
    Parallelism: 1
    On failure: pause
    ContainerSpec:
    Image: citizenstig/dvwa
    Resources:

    [root@node1 ~]# docker service ps dv
    ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
    7t5qj48rzmeezc1q0rd663gcm dv.1 citizenstig/dvwa node1 Running Running about a minute ago
  • 扩容 scale

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@node1 ~]# docker service scale dv=3
    dv scaled to 3
    [root@node1 ~]# docker service ps dv
    ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
    7t5qj48rzmeezc1q0rd663gcm dv.1 citizenstig/dvwa node1 Running Running 2 minutes ago
    9ohh5xlgffbmzuc8rcfc3bvyu dv.2 citizenstig/dvwa node2 Running Preparing 14 seconds ago
    20dygfzgpfoilxkdg7lffy47v dv.3 citizenstig/dvwa node2 Running Preparing 14 seconds ago

    我们查看一下任务在2个节点的分布状态
    [root@node1 ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    443133ab06bf citizenstig/dvwa:latest "/run.sh" 9 minutes ago Up 9 minutes 80/tcp, 3306/tcp dv.1.7t5qj48rzmeezc1q0rd663gcm
    [root@node2 ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    0aa62a67014c citizenstig/dvwa:latest "/run.sh" 2 minutes ago Up 2 minutes 80/tcp, 3306/tcp dv.2.9ohh5xlgffbmzuc8rcfc3bvyu
    a2131cd7d1b4 citizenstig/dvwa:latest "/run.sh" 2 minutes ago Up 2 minutes 80/tcp, 3306/tcp dv.3.20dygfzgpfoilxkdg7lffy47v
  • 停止服务

    1
    2
    3
    4
    [root@node1 ~]# docker service rm dv
    dv
    [root@node1 ~]# docker service ps dv
    Error: No such service: dv
  • 滚动更新
    前提:集群中的节点都包括了相同的images,这里使用citizenstig/dvwa

    1
    2
    3
    4
    5
    6
    docker service create \
    --replicas 3 \
    --name dvwa \
    --update-delay 10s \
    citizenstig/dvwa
    31rs07r46qg6m6jkrxwi0h23g

    通过以下命令查看

    1
    2
    docker service inspect --pretty dvwa
    docker service ps dvwa

    升级为 dvwa:v2 这个image,通过以下命令查看变化

    1
    2
    3
    4
    5
    docker service update --image dvwa:v2 dvwa
    docker service inspect --pretty dvwa
    docker service ps dvwa
    #清理
    docker service rm dvwa
  • 管理 worker 节点
    a. 不可用

    1
    2
    docker node update --availability drain node2
    docker node ls

    将 node 设置为 drain 后,表明:该 node 将不会运行任务;可以观察到,该 node 中运行的服务正在自动迁移到线上的其他 node 上。
    示例:将 manager node 设置为 drain,从而避免任务在该 node 上运行,保持 manager 的单一和资源。
    b. 激活

    1
    docker node update --availability active node1

    c. 提升为 manager 和降级

    1
    2
    3
    4
    docker node ls
    docker node promote node1
    docker node ls
    docker node demote node1
  • overlay 网络

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 创建一个 覆盖 所有集群的 overlay  网络
    docker network create --driver overlay --opt encrypted --subnet=10.0.9.0/24 my-net
    #使用 --opt encrypted 标识

    # 创建 service 时添加 --endpoint-mode dnsrr 使用dns 做为服务发现,否则跨主机之间无法通讯
    # 例:
    docker service create --replicas 3 --name my-nginx --network my-net --endpoint-mode dnsrr nginx:alpine

    # 使用 nslookup my-nginx 查询dns 情况
    -----------------------------------------------------------------------------------------------------------
    nslookup: can't resolve '(null)': Name does not resolve
    Name: my-nginx
    Address 1: 10.0.9.3 b177080c9e65
    Address 2: 10.0.9.2 my-nginx.1.0p2gn3h3ujoghub8ilyyvbenq.my-net
    Address 3: 10.0.9.4 my-nginx.3.axmsfkrxd89gbp75j00cu5qqw.my-net
  • 挂载目录, mount

    1
    docker service create --mount type=bind,target=/container_data/,source=/host_data/

    示例 - 本地目录: target = 容器里面的路径, source = 本地硬盘路径

    1
    2
    3
    #docker service create --mount type=volume,source=<VOLUME-NAME>,target=<CONTAINER-PATH>,volume-driver=<DRIVER>

    docker service create --name nginx --mount type=bind,target=/usr/share/nginx/html/,source=/opt/web/ --replicas 2 --publish 80:80/tcp nginx

    示例 - 挂载volume卷: source = volume 名称 , traget = 容器里面的路径

    1
    docker service create --name nginx --mount type=volume,source=myvolume,target=/usr/share/nginx/html,volume-driver=local --replicas 2 --publish 80:80/tcp nginx
常见使用

常见的双层(web+db)应用可按以下方法创建

1
2
3
4
docker network create -d overlay mynet
docker service create --name frontend --replicas 5 -p 80:80/tcp \
--network mynet mywebapp
docker service create --name redis --network mynet redis:latest

由5套Nginx容器构成的Swarm作为单一内部负载均衡型服务,且于Swarm内任意节点的端口80上进行交付

ref
docker深入2-熟悉v1.12
Docker 1.12 Swarm Mode http://初上手体验
Docker 1.12 Swarm Mode集群实战(第二章)
Swarm Mode
docker 1.12 swarm


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。