Docker编排与集群部署

Fig/Compose编排工具
  • Fig/Compose的介绍
    • 在生产环境中,整个团队需要发布的容器数量很可能极其庞大,而容器之间的联系和拓扑结构也可能非常复杂,往往太难升就是集群化的,并且具备高可用设计。
    • 如果依赖人工记录和配置这样的复杂容器关系,并保障集群正常运行、监控、迁移、高可用等常规运维需求,难免力不从心
    • 因此Fig/Compose就是解决这一问题的。Dockerfile可以重现一个容器,Compose可以重现容器的配置和集群
  • 编排和部署
    • 编排
      • 它根据被部署的对象之间的耦合关系,以及被部署对象对环境的依赖,制定部署流程中各个动作的执行顺序,部署过程所需要的依赖文件和被部署的文件的存储位置和获取方式,以及如何验证部署成功。
      • 这些信息都会在编排工具中以制定的格式来要求运维人员定义并保存起来,从而保证这个流程能够随时在全新的环境中可靠有序的重现出来
    • 部署
      • 是指按照编排制定的内容和流程,在目标机器上执行编排制定的环境初始化,存放制定的依赖和文件,运行制定的部署动作,最终按照编排中的规则来确认部署成功
      • 在Compse的世界里,编排和部署的组合结果,就是一朵"容器云"
  • 编排工具-Compose的使用
    • Compose安装
      • yum -y install epel-release && yum -y install python-pip && pip install docker-compose
  • Compose的使用
    • Compose常用命令
      • docker-compose up   启动服务(当前目录下需要有.yml文件)
        • -d:   后台启动,默认是前台启动
        • -f:    指定详细的docker-compose.yml文件, 默认为当前目录下的docker-compose.yml
        • -p:   指定项目名称启动
        • -H:  指定链接到哪一个Hoser daemon
        • --no-recreate,不会新创建容器,如果有已经存在的容器,那么会直接启动
      • docker-compose start  启动已经存在的容器作为一个服务
      • docker-compose stop  停止运行的容器而不删除它们
      • docker-compose restart  重启已经停止的容器
    • .yml文件的配置选项
      • build
        • 指定Dockerfile路径和上下文路径,Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器
        • args为构建(build)过程中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用。
      • image
        • 指定使用的镜像,本地不存在会从HUB拉取,当和build同时使用,会把生成的镜像标记为image定义的镜像名称
      • command
        • 容器启动后执行的命令,会覆盖默认的启动命令
      • ports
        • 用于暴露端口给主机, 当不指定主机映射端口时,不能供外部访问(host_ip:container_ip)
      • expose
        • 提供container之间端口访问, 不会暴露给主机使用.同docker run --expose
      • volumes
        • 挂在目录
      • environment
        • 添加环境变量,同docker run -e 
      • depends_on
        • 指定依赖,将会优先于该服务创建并启动依赖
      • extra_hosts
        • 添加主机名映射
      • network_mode
        • 定义网络模式  同docker --net参数
      • privileged
        • 是否使用privileged模式
      • env_file
        • 指定变量的文件,默认为docker-compose文件夹下的 .env 文件.
        • 同一个变量,通过export设置,会覆盖env_file中的变量.
        • env_file: .env
  • env_file:
  •   - ./common.env
  •   - ./apps/web.env
  •   - /opt/secrets.env

      • cat .env
      •  MYSQL_DATA_DIR=/my/sql/data-dir
    • tty
      • 是否给容器分配终端
      • 当想要让容器后台运行的时候,必须带该配置,不然不会分配终端,容器执完命令会自动退出
  • 编排.yml文件使用示例
    • networks关键字:
      • compose file中顶级networks关键字,可以用来创建更加复杂的网络拓扑,指定自定义网络驱动和选项,也可以用它来连接外部创建(非Compose创建)的网络。
      • 每个Service可通过service内部的networks关键字来指定它要使用的顶级网络。给Service指定networks的好处是,实现网络隔离或连接
      • 每个网络中的启动的容器,可以实现相互的网络通信,容器直接可以使用容器名进行通信
  • 使用Docker-compose进行网络通信
    • 第一种方法:
      • 将service部署到同一个网络环境中,即可实现容器的互相通信,使用container_name即可
      • 示例:
    • 第二种方法:
      • 使用自定义局域网络,容器之间使用静态ip进行通信
      • 示例:
    • 第三种方法
      • 先给每个服务指定容器的名称
      • 再在每个服务中给容器添加extra_host对应容器的映射关系
  • Compose的缺点
    • docker-compose是面向单宿主机部署的,这是一种部署能力的欠缺,管理员需要借助成熟的自动化运维工具来管理多个目标机,将docker-compose所需要的所有资源包括配置文、用户代码交给所有的目标机,再在目标机上运行docker-compose指令
    • docker-compose还不能提供跨宿主机的网络和存储。这意味着管理员必须部署一套类似于Open vSwich的堵路网络工具,而且管理员还需要完成继承工作。
    • Docker官方给出了一套用Compse、Machine、Swarm联动的解决方案
集群抽象工具Swarm
  • Swarm的介绍
    • Swarm的目的是将多个宿主机抽象为"一台"宿主机来对待
    • Swarm在多台Docker宿主机(Docker服务端)上建立了一层抽象,可以通过操作Swarm服务端实现对宿主机的资源分配和管理
    • Swarm通过在Docker宿主机上添加标签信息来讲宿主机资源进行细粒度分区,通过分区来帮助用户将容器部署到目标宿主机上
    • 利用Swarm可以实现控制一台Swarm Manager来控制整个Docker集群。
  • Swarm集群的Agent\Manager
    • Agent: Agent节点运行Docker服务端,Docker Release的版本需要保证一怔,且为1.4.0或更新的版本。
    • Manager:Manager节点负责与所有的Agent上的Docker宿主机通信以及对外提供Docker远程API服务,因此Manager负责能获取到所有的Agent地址。当通过Docker客户端与Manager通信,执行docker run命令时,Manager会选择一个Agent来执行该命令,并执行结果返回给Docker客户端
  • 创建一个Swarm集群
    • 搭建Swarm集群
      • 1.拉取swarm镜像
        • docker pull swarm
      • 2.把准备加入集群的所有的节点的docker deamon的监听端口修改为0.0.0.0:2375
        • vi /etc/default/docker
        • DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"  在文件结尾添加
        • service docker restart   重启docker服务
      • 3.在manage节点新建一个文件,把要加入到集群的机器的IP地址都写进去
      • 4.执行swarm manage命令(在manage节点上)
        • docker run –d –p 2376:2375 –v $(pwd)/cluster:/tmp/cluster swarm manage file:///tmp/cluster
          • 这里一定要使用-v命令,因为cluster文件是在本机上面,启动的容器默认是访问不到的,所以要通过-v命令共享
      • 5.让集群运行某些命令
        • 随机指定节点来运行
          • docker -H <manage_host:manage_port> info
          • docker -H <manage_host:manage_port> run -it ubuntu /bin/bash
        • 通过lable来指定某个节点来运行命令
          • docker -d --lable  storage  给节点加上storage标签
          • sudo docker run –H 10.13.181.83:2376 run –name redis_083 –d –e constraint:storage redis    通过指定标签来选择节点启动
      • 6.Docker客户端与Manager通信
        • docker -H <manage_host:manage_port> run -it ubuntu /bin/bash 
      • 7.删除一个节点
        • docker node rm --force node1  
  • Swarm的调度测略(可以通过strategy来选出最终运行容器的宿主机)
    • Random :顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU,RAM以及正在运行的容器的数量来计算应该运行容器的节点。
    • Spread :会选择运行容器最少的那台节点来运行新的容器,使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
    • binpack: 会选择运行容器最集中的那台机器来运行新的节点,binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。
跨平台宿主环境管理工具-Machine
  •  Machine的介绍
    • 搭建环境想来是一个重复造轮子的过程,Machine这一工具把用户搭建Docker环境的跟中方案汇集在一起,即一目了然的简化了Docker环境的创建过程,让用户继续讲时间投入到应用开发商,而不是无谓的花费在环境的搭建上
    • Machine的主要功能就是帮助用户在不同的云主机提供商上创建和管理虚拟机,并在虚拟机中安装Docker
    • 用户只需要提供几项登录凭证即可等待环境安装完成。Machine能便捷地管理所有通过它创建的Docker宿主机,进行宿主机的启动、关闭、重启、删除等操作
    • 使用Machine可以在最开始快速创建多台主机系统,并搭建Docker部署环境,接下俩就可以使用swarm创建集群等操作
  • Machine与虚拟机软件
    • Machine包含的虚拟机驱动有VirtualBox、VMware FUsion、Hyper-V
    • 使用Machine前,机器上需要有上述的三种软件之一,需要在命令中指定使用哪一种
    • 当不需要创建虚拟镜像充当主机的时候,我们也可以直接指定主机的ip方式来通过Docker Machine来控制多个真正的主机
  • Docker Machine的使用
    • 安装Docker Machine
      • curl -L https://github.com/docker/machine/releases/download/v0.12.0/docker-machine-`uname -s`-`uname -m` > /tmp/docker-machine
      • chmod +x /tmp/docker-machine
      • sudo mv /tmp/docker-machine /usr/local/bin/docker-machine
    • 使用Docker Machine的前提条件
      • sudo adduser nick 
      • sudo usermod -a -G sudo nick    在目标主机上创建一个用户并加入sudo 组
      • sudo vi  sudoer    
      • nick   ALL=(ALL:ALL) NOPASSWD: ALL    为该用户设置 sudo 操作不需要输入密码
      • ssh-copy-id -i ~/.ssh/id_rsa.pub nick@xxx.xxx.xxx.xxx     把本地用户的 ssh public key 添加到目标主机上
  • 第一种安装Docker方法:在目标主机上安装Docker
    • 命令
            docker-machine create -d generic \
                --generic-ip-address=xxx.xxx.xxx.xxx \
                --generic-ssh-user=nick \
                --generic-ssh-key ~/.ssh/id_rsa \
                krdevdb
    • 备注:
      • create 命令本是要创建虚拟主机并安装 Docker,因为本例中的目标主机已经存在,所以仅安装 Docker。
    • 解释
      • -d 是 --driver 的简写形式,主要用来指定使用什么驱动程序来创建目标主机。Docker Machine 支持在云服务器上创建主机,就是靠使用不同的驱动来实现了。本例中使用 generic 就可以了
      • --generic 开头的三个参数主要是指定操作的目标主机和使用的账户。最后一个参数 krdevdb 是虚拟机的名称
  • 第二种安装Docker方法:在本地主机上安装Docker虚拟机
    • 命令
            docker-machine create \
                --driver vmwarevsphere \
                --vmwarevsphere-vcenter=xxx.xxx.xxx.xxx \
                --vmwarevsphere-username=root \
                --vmwarevsphere-password=12345678 \
                --vmwarevsphere-cpu-count=1 \
                --vmwarevsphere-memory-size=512 \
                --vmwarevsphere-disk-size=10240 \
                testvm
  • 备注:
    • 在实际使用中我们一般会在物理机上安装 vSphere 等虚拟机管理软件,并称之为虚拟机 host。然后通过 vSphere 工具安装虚拟机进行使用。接下来我们将介绍如何在本地的一台安装了 vSphere 的虚拟机 host 上安装带有 Docker 的虚拟机
  • 参数解释:
            --driver vmwarevsphere   需要给 Docker Machine 提供对应的驱动,这样才能够在上面安装新的虚拟机。
            --vmwarevsphere-vcenter=xxx.xxx.xxx.xxx \
            --vmwarevsphere-username=root \
            --vmwarevsphere-password=12345678 \    上面三行分别指定了虚拟机 host 的 IP 地址、用户名和密码。
            --vmwarevsphere-cpu-count=1 \
            --vmwarevsphere-memory-size=512 \
            --vmwarevsphere-disk-size=10240 \    上面三行则分别指定了新创建的虚拟机占用的 cpu、内存和磁盘资源。
            testvm      最后一个参数则是新建虚拟机的名称。
  • 查看docker machine 管理的主机列表
    • docker-machine ls 
  • 获取构造docker主机时使用的命令
    • docker-machine config  dev
  • 获取连接到某个主机需要的环境变量
    • docker-machine env dev   
    • eval "$(docker-machine env dev)"   会指定接下来和哪台主机的docker daemon进行通信
  • 启动\停止\重启虚拟机
    • docker-machine start/stop/restart  dev   
  • SSH到宿主机上执行命令
    • docker-machine ssh dev /start.sh   
  • 获取主机的url
    • docker-machine url   
  • 主机之间传递文件
    • docker-machine scp  




刘小恺(Kyle) wechat
如有疑问可联系博主