• DOCKER 学习笔记8 Docker Swarm 集群搭建


    前言

    在前面的文章中,已经介绍如何在本地通过Docker Machine 创建虚拟Docker 主机,以及也可以在本地Windows 创建虚拟主机,也是可以使用的。这一节,我们将继续学习 Docker 三剑客之一 : Docker Swarm

    Docker Swarm

    Docker Swarm 是Docker 的本地聚集类,它将一组Docker 主机转换为一个虚拟单独的 Docker 主机。Docker Swarm 使用标准的Docker API。所以与Docker 守护进程交互的工具都可以使用 Swarm 对多个主机进行转换扩展。 包括有:

    • Docker Componse
    • Docker Machine
    • Dokku

    Docker Swarm 支持即插即用原则,随着初始开发的结束,API 开发起来支持可插后端。 这意味着您可以交换调度后端 Docker Swarm 使用的开箱即用与后端您喜欢。 Swarm 的可切换设计为大多数用例提供了一个平滑的开箱体验。

    安装 Docker Swarm

    我们可以通过官方Docker Swarm 的镜像来创建一个集群,因为Docker Swarm 其实也是一个 Docker images

    docker run swarm --help

    
    $ docker run swarm --help
    Unable to find image 'swarm:latest' locally
    latest: Pulling from library/swarm
    d85c18077b82: Pull complete                                                                                             1e6bb16f8cb1: Pull complete                                                                                             85bac13497d7: Pull complete                                                                                             Digest: sha256:b866583a3b8791bcd705b7bc0fd94c66b695a1a2dbaeb5f59ed29940e5015dc8
    Status: Downloaded newer image for swarm:latest
    Usage: swarm [OPTIONS] COMMAND [arg...]
    
    A Docker-native clustering system
    
    Version: 1.2.9 (527a849)
    
    Options:
      --debug                       debug mode [$DEBUG]
      --log-level, -l "info"        Log level (options: debug, info, warn, error, fatal, panic)
      --experimental                enable experimental features
      --help, -h                    show help
      --version, -v                 print the version
    
    Commands:
      create, c     Create a cluster
      list, l       List nodes in a cluster
      manage, m     Manage a docker cluster
      join, j       Join a docker cluster
      help          Shows a list of commands or help for one command
    
    Run 'swarm COMMAND --help' for more information on a command.
    
    

    因为是第一次使用镜像,所以Docker Engine 会检查当前环境是否有这个镜像,没有则拉取了最新的版本到本地。

    使用Docker Swarm 镜像的好处

    相比于其他方法,使用Swarm 镜像的好处在于

    • 不需要额外再系统上安装任何二进制执行文件来使用 Swarm
    • 可以通过docker engine 获取到最新版本
    • 容器与Swarm 环境隔离。不需要单独维护

    创建具有交互式容器的集群

    集群,需要创建一个管理节点和工作节点。这里测试创建一个管理节点,在管理节点加入两个工作节点,这就组成一集群。

    创建管理节点

    docker-machine ls 查看现有虚拟主机

    
    $ docker-machine.exe ls
    NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
    default   *        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.5
    
    

    发现已经有一个虚拟主机在运行,其实可以将这个主机作为管理主机

    通过 SSH 连接管理节点,在第一个虚拟机 创建管理节点

    docker-machine ssh default 连接虚拟主机,开启Swarm

    
    docker@default:~$ docker swarm init --advertise-addr 192.168.99.102
    Swarm initialized: current node (5mohlisxbrkogfbtzk6nujkfw) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
    

    docker swarm init --advertise-addr 192.168.99.102

    这里需要指定一个地址,因为虚拟机,通过ip address 可发现这个虚拟机有多个网卡,所以,我们需要指定一个地址。

    创建主节点后,可以获取到一个 Token 这个token 呢 就是我们需要创建 服务节点所需要用到的。

    docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377
    

    执行 docker info 后我们可以发现,当前Swarm 已经是活动的状态,管理节点 1

    
     Swarm: active
      NodeID: rzu7l3z4mysplwgdce8vj2364
      Is Manager: true
      ClusterID: uuq50bc4x4bckqfglkrj05vao
      Managers: 1
      Nodes: 1
      Default Address Pool: 10.0.0.0/8
    
    

    docker node ls 可以查看当前节点信息

    
    docker@default:~$ docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    5mohlisxbrkogfbtzk6nujkfw *   default             Ready               Active              Leader              19.03.5
    
    

    创建工作节点

    docker-machine create work1 创建一个默认的VirtualBox VM 的虚拟主机。

    docker-machine ssh work1 连接虚拟主机后,将本节点加入管理节点

    docker@work1:~$ docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377
    This node joined a swarm as a worker.
    

    同样的,再创建一个work2 节点,加入到default 当中。

    管理节点信息

    当前主机上,我们可以查看到所有的虚拟主机情况。

    $ docker-machine.exe ls
    NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
    default   *        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.5
    work1     -        virtualbox   Running   tcp://192.168.99.103:2376           v19.03.5
    work2     -        virtualbox   Running   tcp://192.168.99.104:2376           v19.03.5
    

    进入管理主机,查看节点的情况。

    docker@default:~$ docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    5mohlisxbrkogfbtzk6nujkfw *   default             Ready               Active              Leader              19.03.5
    qqgd4abpjw08lwh31ddgez041     work1               Ready               Active                                  19.03.5
    gblxw2whlxl0k94nmfozhs7gl     work2               Ready               Active                                  19.03.5
    
    

    服务和任务关系

    • 服务是一组任务的集合,一个服务可以有多个任务。
    • 任务是集群里面最小的一个单位,比如ping www.baidu.com

    部署集群服务

    docker-machine ssh default 连接管理主机

    
    docker@default:~$ docker pull alpine
    Using default tag: latest
    latest: Pulling from library/alpine
    c9b1b535fdd9: Pull complete                                                                                                                                                              Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
    Status: Downloaded newer image for alpine:latest
    docker.io/library/alpine:latest
    
    

    拉取一个 alpine linux 镜像

    Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗

    部署任务

    docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

    docker service create --replicas 1  --name hello-world alpine ping www.baidu.com
    
    • --replicas 指定任务的数量
    • --name 指定服务的名称
    • alpine 需要运行的镜像名称
    • ping www.baidu.com 镜像里面需要运行的命令
    
    docker@default:~$ docker service create --replicas 1  --name hello-world alpine ping www.baidu.com
    nzr66u3j32ndgzodw08cer1he
    overall progress: 1 out of 1 tasks                                                                                                                                                       1/1: running[==================================================>]                                                                                                                     verify: Service converged   
            
    

    常用命令

    docker service ps <name> 查看服务的运行状态、以及进展

    docker@default:~$ docker service ps hello-world
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
    j03uhnoauhet        hello-world.1       alpine:latest       default             Running             Running 8 minutes ago
    

    docker service ls 查看当前Swarm 集群所运行的所有任务

    docker@default:~$ docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    nzr66u3j32nd        hello-world         replicated          1/1                 alpine:latest
    

    监控服务

    docker service inspect --pretty hello-world 命令可以概览服务的运行情况。

    
    ID:             nzr66u3j32ndgzodw08cer1he
    Name:           hello-world
    Service Mode:   Replicated
     Replicas:      1
    Placement:
    UpdateConfig:
     Parallelism:   1
     On failure:    pause
     Monitoring Period: 5s
     Max failure ratio: 0
     Update order:      stop-first
    RollbackConfig:
     Parallelism:   1
     On failure:    pause
     Monitoring Period: 5s
     Max failure ratio: 0
     Rollback order:    stop-first
    ContainerSpec:
     Image:         alpine:latest@sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
     Args:          ping www.baidu.com
     Init:          false
    Resources:
    Endpoint Mode:  vip
    
    

    弹性伸缩

    docker service update --replicas 2 hello-world 将原来的服务任务数量改为2次

    docker@default:~$ docker service update --replicas 2 hello-world
    hello-world
    overall progress: 2 out of 2 tasks                                                                                                                                                       1/2: running   [==================================================>]                                                                                                                     2/2: running   [==================================================>]                                                                                                                     verify: Service converged     
    

    docker service ps <name> 查看本次任务的运行情况

    docker@default:~$ docker service ps hello-world
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
    j03uhnoauhet        hello-world.1       alpine:latest       default             Running             Running 26 minutes ago
    k6oudbv4e9he        hello-world.2       alpine:latest       work1               Running             Running about a minute ago
    

    这里将这两个任务分配到 default work1 节点

    查看 work1 节点运行情况

    ### 进入work1
    docker-machine ssh work1
    
    docker@work1:~$ docker ps
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
    1c86154f43f4        alpine:latest       "ping www.baidu.com"   4 minutes ago       Up 4 minutes                            hello-world.2.k6oudbv4e9henfqbhvulxt1y2
    
    

    从集群退出

    docker swarm leave 执行退出命令后,该节点已下线。

    docker@default:~$ docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    5mohlisxbrkogfbtzk6nujkfw *   default             Ready               Active              Leader              19.03.5
    qqgd4abpjw08lwh31ddgez041     work1               Down                Active                                  19.03.5
    gblxw2whlxl0k94nmfozhs7gl     work2               Ready               Active                                  19.03.5
    

    参考

    https://www.cnblogs.com/ityouknow/p/8903975.html

  • 相关阅读:
    IO流(读取键盘录入)
    IO 流 自定义字节流的缓冲区-read 和write 的特点
    IO流 字节流的缓冲区
    IO流 拷贝图片
    IO流-字节流File读写操作
    IO流 带行号的缓冲区
    IO流(装饰设计模式)
    IO流-ReadLine方法的原理 自定义BufferedReader
    IO流 Buffered 综合练习
    IO流 BufferedWriter
  • 原文地址:https://www.cnblogs.com/ChromeT/p/12306725.html
Copyright © 2020-2023  润新知