Docker笔记:Docker Swarm 搭建集群与项目部署

关于 Docker Swarm

1 )Swarm的引入

  • Docker Compose 只能编排单节点上的容器,即: 单台服务器上的集群部署
  • 如果要实现多台服务器上的集群部署,就可以选择 Swarm
  • Docker Swarm 是Docker公司推出的用来管理docker集群的工具
  • 使用 Docker Swarm 可以快速方便的实现高可用集群
  • Docker Swarm 可以让我们在单一主机上操作来完成对整个容器集群的管理工作
  • 使用Docker Swarm可以让单一主机上的容器快速部署到10个、20个或者200个主机上面,实现高可用集群
  • 从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm)
  • 并且已经内置了服务发现工具,我们就不需要像之前一样, 再配置 Etcd 或者 Consul 来进行服务发现配置了
  • Dokcer Swarm 是Docker官方的提供的集群部署管理工具,基于原生Docker
  • 相比K8s要更简单、更容易上手
  • 如果您的节点(物理机)在1000台以内,完全可以使用 Docker Swarm 实现部署
  • Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些

2 )Swarm 节点

  • Docker swarm中有节点的概念,一个节点就可以通俗的理解为一个机器
  • 可以是物理服务器也可以是虚拟机、云等等
  • 节点分为: 管理 (manager) 节点和工作 (worker) 节点
  • 管理节点(Manager)
    • 管理节点用于 Swarm 集群的管理,负责集群控制
    • 通过监控集群状态、分发任务到工作节点
    • docker swarm 命令基本只能在管理节点执行
    • 节点退出集群命令 docker swarm leave 可以在工作节点执行
    • 一个 Swarm 集群可以有多个管理节点,节点数量可以是 3, 5, 7 个,用来保证管理节点的高可用
    • 但只有一个管理节点可以成为leader,leader 通过 raft 协议实现
  • 工作节点(Worker)
    • 是任务执行节点,管理节点将服务 (service) 下发至工作节点执行
    • 管理节点默认也作为工作节点
  • 节点的有效性有三种
    • Active 调度程序可以分配任务给节点
    • Pause 调度程序不分配新任务给节点,但现有任务继续运行
    • Drain 调度程序不分配新任务给节点,调度程序关闭任何现有任务并将它们调度到可用节点上

3 )Swarm 任务和服务

  • 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器
  • 服务 (Services) 是指一组任务的集合,服务定义了任务的属性

Docker swarm 集群搭建

1 )准备工作

  • 准备4台机器(物理机,虚拟机,云主机都可以),假定他们ip分别是
    • 192.168.1.10 作为管理节点
    • 192.168.1.11 作为工作节点
    • 192.168.1.12 作为工作节点
    • 192.168.1.13 作为工作节点
  • 先关闭防火墙,作为演示,注: 实际服务器要配置防火墙规则,仅作为网络连通演示
    • 使用 centos 演示
      • 关闭 SELinux
        • $ getenforce 查看状态
        • 如果不是关闭状态,则修改配置文件
          • $ vi /etc/selinuux/config
          • 修改 SELINUX=enforcing 改为 SELINUX=disabled
      • 关闭防火墙
        • $ systemctl stop firewalld
      • 配置主机 hostname
        • 获取hostname $ hostname
        • 修改有两种方式
          • 临时有效: $ hostname worker_11
          • 永久有效: $ vi /etc/hostname 并 重启机器
            • .10 配置 manager_10
            • .11 配置 worker_11
            • .12 配置 worker_12
            • .13 配置 worker_13

2 )初始化集群

  • 在 .10 这个管理节点上操作
    • $ docker swarm init --advertise-addr 192.168.1.10
    • 之后会输出一段提示命令
  • 在 .11,.12,.13 主机上执行上述提示命令
    • $ docker swarm join --token SWMTKN-1-52tr219htvsg1volky2tej7pj8bjs2j78q4b6wc9fnt72kkchd-29ohn4mgz191f6oznldvjiw47 192.168.1.10:2377
    • 这样工作节点都加入到了集群里,上述 token 是当前管理节点签发的一个令牌
  • 在 .10 上
    • 执行 $ docker node ls, 可以看到集群里有哪些节点了, 这个命令只能在 manager节点上运行
    • 执行 $ docker node inspect 具体的nodeID 可查看节点详细信息
  • 有新的机器想要加入集群,则在 .10 机器上,输入 $ docker swarm join-token worker
    • 就可以重现第一次出现的加入命令
  • 如果想要加入 manager, 则在 .10 机器上,输入 $ docker swarm join-token manager
    • 就可以看到创建 manager节点的命令
  • 删除节点,执行两个命令
    • 在管理节点上 $ docker node rm nodeID -f
    • 在工作节点上 $ docker swarm leave -f
    • 不分顺序
  • 管理节点降级为工作节点 $ docker node demote nodeID
  • 工作节点升级为管理节点 $ docker node promote nodeID

Docker Swarm创建容器并部署项目

  • 之前 docker run 创建的容器,只能在当前计算机上运行, 不具备扩容性,不方便管理
  • 现在 docker service 服务具备扩容,滚动更新,回滚等功能,可部署在多台服务器
    • 创建的服务可以包含多个容器
    • 会自动部署到 docker swarm 对应的集群里
  • $ docker service logs 查看某个服务日志
  • $ docker service rm serviceName 删除某个服务
  • $ docker service ls 查看所有服务详情
  • $ docker service inspect 查看服务详情
  • $ docker service ps serviceName 查看服务力运行的xxx容器

1 )创建nginx对应的服务,里面可以包含多个容器

  • $ docker service create --name nginx --replicas 2 --publish 80:80 nginx
    • --replicas 指定副本数量
    • 这样可以把2个容器随机部署到集群中的2台机器上
  • 通过 $ docker service ls 可按到运行的 nginx 服务
  • $ docker service ps nginx 查看 nginx 服务有哪些容器
  • 部署好之后,就可以通过 ip地址或域名访问到 nginx 服务了
  • 其底层实现是,基于 ingress 网络完成通信和负载均衡
    • 访问集群里的任意一台服务器,都可以访问到 nginx
  • 上面指定了端口,也不会存在冲突,实际映射的是服务端口,只暴露了一个服务端口
  • 我们访问的时候,是访问的服务

2 )对nginx服务进行动态调整(扩容和缩容)

  • $ docker service update --replicas 3 nginx
  • $ docker service scale nginx=3
  • 指定数量可以超过主机数量,每台主机可运行多个nginx服务
  • 当一台机器上一个容器挂掉后,会动态的随机启动一个新的容器

3 )创建 nginx 并映射目录

  • $ docker service create --name nginx --replicas 8 -p 80:80 --mount type=bind,src=/root/wwwroot/html,dst=/usr/share/nginx/html nginx
    • src 物理机或本机目录
    • dst nginx容器里面的目录
    • 以上命令在管理节点执行
  • 以下命令在所有机器上执行
    • $ mkdir /root/wwwroot/html
    • $ cd /root/wwwroot/html
    • $ touch index.html 写一些任意的东西
    • 以上这些在集群的所有机器上执行
  • 当访问任意节点ip的时候,可能加载的并非当前ip对应主机的服务
    • 比如访问 .11 的节点,可能提供服务的,并非 .11主机内的服务
    • 这里是基于 ingress 网络实现的负载均衡
    • 内部有个算法实现计算谁的资源空闲,找谁提供服务

你可能感兴趣的:(Git,Github,Linux,Docker,docker)