zoukankan      html  css  js  c++  java
  • docker入门3-docker swarm

    swarm介绍

    想要将应用部署在一个集群并运行在多台机器上?

    通过将多台机器链接到“Dockerized"集群以实现应用程序运行在多容器,多机器的技术被称为swarm

    一个swarm是一组运行docker的机器,它们加入同一个集群,加入swarm的都被当做一个节点。在集群下,需要一个swarm manager管理所有机器,执行docker命令和同意其他节点加入swarm就是通过这个manager。其余都是workers,它们只提供劳动力,无权告知其他节点该做什么或者不能做什么。

    之前的docker使用都是单主机,这里将使用虚拟机,尝试多机器下的swarm模式。

    swarm创建

    一个swarm由一群节点构成。它的基本思想很简单: 运行docker swarm init开启swarm模式并让当前机器成为manager,其他机器再通过docker swarm join加入这个swarm当苦力。

    这里使用virtualbox创建虚拟机。系统是Mac os X。

    安装virtualbox虚拟机

    安装教程地址:

    https://www.virtualbox.org/wiki/Downloads

    使用docker-machine创建VMs

    使用docker桌面版,docker-machine默认安装。docker-machine不止是方便我们使用部署虚拟机,也能用于部署对物理机的部署,阿里云也有相关的驱动,方便在阿里云上高效部署机器。

    docker-machine create --driver virtualbox myvm1
    docker-machine create --driver virtualbox myvm2
    

    创建两个虚拟机。这里`--driver``指定使用virtualbox创建虚拟机,docker-machine会自动使用名为boot2docker.iso的精简版Linux镜像,里面自带docker。

    docker-machine查看虚拟机

    docker-machine ls查看运行的虚拟机。active带*的代表是当前进入的机器。

    docker-machine连接虚拟机

    直接的方式

    docker-machine ssh <vmname> "<Command>"

    配置env环境

    eval $(docker-machine env <vmname>)

    docker-machine env myvm1输出如下:

    export DOCKER_TLS_VERIFY="1"
    export DOCKER_HOST="tcp://192.168.99.100:2376"
    export DOCKER_CERT_PATH="/Users/cheny/.docker/machine/machines/myvm1"
    export DOCKER_MACHINE_NAME="myvm1"
    

    这些都是导入环境变量的语句,eval执行这个设置环境变量的语句,docker运行时会读取这些环境变量,之后就会自动将语句发送到相应的机器上执行。

    简而言之就是配置好指向myvm1的环境变量之后,本地执行docker stack deploy -c docker-compose.yml getstartedlab,其实就是在myvm1中执行,而且docker会自动将本地的docker-compose.yml文件应用到myvm1这个机器上,省掉了分发配置文件的步骤。

    退出myvm1的方式是eval $(docker-machine env -u)-u就是unset的意思。

    虚拟机上创建swram并加入swarm

    我选择使用env的方式,在myvm1上创建节点。不使用env的方式,可以使用命令docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>创建。

    返回结果是:

    Swarm initialized: current node (jbgyylqqg2bxyd2gkml66nqmt) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-4m109aavz9wjhqc2rx7qkqyux3cnlvcyhnokhew31jipneer6n-191ckpl6qfq7alp2ggihgvmhs 192.168.99.100:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    

    上面明确说明,进入其他机器,执行docker swarm join --token SWMTKN-1-4m109aavz9wjhqc2rx7qkqyux3cnlvcyhnokhew31jipneer6n-191ckpl6qfq7alp2ggihgvmhs 192.168.99.100:2377加入swarm。通过env的方式进入其他机器照着做就是。

    查看swarm node

    进入manager,也就是这里的myvm1中,执行docker node ls,就可以看到两台机器和它们的状态。

    在swarm中部署app

    通过docker-compose.yml文件可以看到,当前的services只有一个,名字叫web。其实我们还有redis这个service没有部署,会在stack章节中补上。

    在myvm1这个manager上使用docker stack deploy -c docker-compose.yml getstartedlab部署一个名为getstartedlab的stack。一个stack下可以有多个service,但我们只有一个名为web的service,它下面有5份container,按照默认的负载均衡策略,这个名为web的service下面的container可能会分布在myvm1和myvm2两台机器上。

    以后所有的部署任务都在myvm1这个manager上执行,它会根据当前swarm下有多少机器自动对部署进行调整,其他的worker当个苦力就好,执行命令跟worker没有关系。

    要伸缩处理能力,只需要增加或减少swarm中的机器和修改yml文件中replicas的数量并重新执行部署命令,整个过程服务依然正常,不会中断。

    查看stack下的service情况

    docker层次理解

    一个swarm下可以有多个stack,每个stack都是一个完整的服务,每个服务都是由一个或多个service构成。这些service可能是数据库,也可能是web应用,它们协力合作组成用户使用的一个完整服务。而每个service由一到多个container组成,这些container可能分布在多个机器上,每个container就是这个分布式系统上实际的工作单位。这是我对docker层次的理解。

    docker stack ps getstartedlab在对docker层次有理解之后,这个查看命令的就明了了。它就是查看名为getstartedlab的stack的详细情况。

    同理:

    • docker stack ls就是查看有哪些stack在当前swarm中。
    • docker service ls就是查看有哪些service在当前swarm中。
    • docker service ps getstartedlab_web就是指定查看当前swarm中名为getstartedlab_web的service。这个名称是自动生成的,代表它是名为getstartedlab的stack下叫web的service。

    清除swarm和stack

    执行命令docker stack rm getstartedlab移除当前stack。

    在worker机器,执行docker swarm leave退出swarm,manager节点只能强制退出docker swarm leave --force,manager退出后意味着整个swarm不复存在。

    docker-machine重启

    docker-machine restart <vmname>重启机器,通过docker-machine --help,得知还有命令docker-machine start <vmname>启动机器,docker-machine stop <vmname>,不过它们更适用于本机的虚拟机。

    系列导航

    docker入门1-docker container
    docker入门2-docker service
    docker入门4-docker stack

  • 相关阅读:
    java图片裁剪原理
    代码整洁之道
    vue.js devtools安装
    Convert DateTime To Varchar with multiple Styles
    Sql Server为数值变量添加删除前导后缀(翻译)
    asp.net ckeditor 3.6.2 + ckfinder 2.1 上传图片
    转摘 IE6 动态创建 iframe 无法显示的 bug
    sql server output parameter
    windows7 无法删除文件夹 提示需要SYSTEM权限
    Kooboo 全文索引研究
  • 原文地址:https://www.cnblogs.com/agichen/p/10426919.html
Copyright © 2011-2022 走看看