zoukankan      html  css  js  c++  java
  • Docker 进阶-2

    docker swarm

    环境准备

    在本地搭建3台虚拟机1C2G,用于swarm集群。

    ip地址 192.168.1.10,192.168.1.11,192.168.1.12. 配置yum源使用阿里云,使用xshell发送到所有session功能,一次操作3台机器

    安装docker

    #配置yum源使用阿里云,使用xshell发送到所有session功能,一次操作4台机器
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
    wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
    yum clean all
    yum makecache
    
    #安装依赖包
    yum -y install gcc gcc++
    yum install -y yum-utils device-mapper-persistent-data lvm2
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    #更新yum 软件包索引,这一步可能因为网络问题而失败,失败之后导致下一步也无法成功.
    yum makecache fast
    
    #安装docker engine 包含3个必备组件,不指定版本,默认安装最新版本
    yum -y install docker-ce docker-ce-cli containerd.io
    systemctl start docker
    #设置docker开机自启
    systemctl enable docker
    #验证docker正确安装,并拉取hello-world
    docker run hello-world
    
    

    配置Docker加速

    配置镜像加速的目的是使用国内的仓库,不然使用国外仓库会比较慢,甚至无法获取镜像。

    #备份docker.service文件,并赋予执行权限
    cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
    chmod a+x /etc/systemd/system/docker.service
    #在内容种增加ExecStart=/usr/bin/dockerd --registry-mirror=https://dh0xuqe2.mirror.aliyuncs.com ,每个账号都可以申请到免费地址
    vim /etc/systemd/system/docker.service
    #reload 并验证
    systemctl daemon-reload
    systemctl restart docker
    ps -ef |grep docker
    

    进入docker 官方

    https://docs.docker.com/engine/swarm/

    左边导航栏: run your app in production --> Configure containers --> Scale your app --> How swarm mode works -

    集群工作模式

    Docker Engine 1.12引入了集群模式,允许你创建一个或多个Docker引擎的集群,称为集群。集群由一个或多个节点组成:在集群模式下运行Docker Engine 1.12或更高版本的物理或虚拟机。有两种节点类型: managers and workers.

    Manager nodes

    manager nodes 处理集群管理任务

    • 维护集群状态

    • 服务调度

    • 服务于集群模式的HTTP API端点

    通过使用Raft实现,管理器可以维护整个集群以及在其上运行的所有服务的一致内部状态。出于测试目的,使用单个管理器运行群集是可以的。如果单管理器集群中的管理器发生故障,您的服务将继续运行,但您需要创建一个新的集群来恢复。

    为了利用集群模式的容错特性,Docker建议您根据组织的高可用性需求实现奇数个节点。当您拥有多个管理器时,您可以从一个管理器节点的故障中恢复,而无需停机。

    重要提示:添加更多的管理器并不意味着增加可伸缩性或更高的性能。一般来说,事实正好相反。

    Worker nodes

    Worker节点也是Docker引擎的实例,它的唯一目的是执行容器。Worker节点不参与Raft分布式状态,不做调度决策,也不服务于集群模式的HTTP API。

    您可以创建一个管理器节点的集群,但是您不能拥有一个没有至少一个管理器节点的工作节点。默认情况下,所有管理人员也是工人。在一个单一的管理节点集群中,你可以运行像docker service create这样的命令,调度程序将所有任务放在本地引擎上。

    为了防止调度程序将任务放置在多节点群中的管理节点上,可以将管理节点的可用性设置为耗尽。调度程序正常地停止处于排泄模式的节点上的任务,并调度活动节点上的任务。调度程序不会将新任务分配给具有耗尽可用性的节点。

    How services work

    当Docker引擎处于集群模式时,要部署应用镜像,需要创建一个service。服务通常是一些大型应用程序上下文中的微服务的映像。服务的例子可能包括HTTP服务器、数据库或您希望在分布式环境中运行的任何其他类型的可执行程序。

    创建服务时,需要指定要使用哪个容器映像,以及要在运行的容器中执行哪些命令。您还为该服务定义了以下选项:

    1. 集群对外提供服务的端口
    2. 一个覆盖网络,用于服务连接到集群中的其他服务
    3. CPU和内存限制和预留
    4. 滚动更新策略
    5. 集群中要运行的映像副本的数量

    Services, tasks, and containers

    当您将服务部署到集群时,集群管理器将接受您的服务定义作为服务的期望状态。然后将集群内节点上的服务调度为一个或多个副本任务。任务在集群的节点上独立运行。

    例如,假设您希望在一个HTTP侦听器的三个实例之间实现负载平衡。下图显示了一个具有三个副本的HTTP侦听器服务。侦听器的三个实例中的每一个都是群集中的一个任务。

    容器是一个孤立的过程。在集群模式模型中,每个任务只调用一个容器。任务类似于调度程序放置容器的“槽”。一旦容器处于活动状态,调度器就会识别出任务处于运行状态。如果容器的健康检查失败或终止,则任务终止

    Tasks and scheduling

    任务是群集内调度的原子单位。当您通过创建或更新服务来声明所需的服务状态时,编排器通过调度任务来实现所需的状态。例如,您定义了一个服务,该服务指示编排器始终保持一个HTTP侦听器的三个实例运行。协调器通过创建三个任务来响应。每个任务都是一个槽,调度程序通过生成一个容器来填充。容器是任务的实例化。如果HTTP侦听器任务随后的健康检查失败或崩溃,则编排器将创建一个新的复制任务,该复制任务将生成一个新的容器。

    任务是一种单向机制。它在一系列状态中单调地发展:分配、准备、运行等。如果任务失败,编排器将删除任务及其容器,然后根据服务指定的所需状态创建一个新任务来替换它。

    Docker群模式的底层逻辑是一个通用的调度和编排器。服务和任务抽象本身不知道它们实现的容器。假设,您可以实现其他类型的任务,如虚拟机任务或非容器化流程任务。调度程序和编排器不知道任务的类型。然而,当前版本的Docker只支持容器任务。

    下图显示了集群模式如何接受服务、创建请求并将任务调度到工作节点。

    Replicated and global services

    有两种类型的服务部署,复制的和全局的。

    对于复制的服务,您可以指定要运行的相同任务的数量。例如,您决定部署一个带有三个副本的HTTP服务,每个副本提供相同的内容。

    全局服务是在每个节点上运行一个任务的服务。没有预先指定的任务数量。每次向集群中添加一个节点时,编排器创建一个任务,调度程序将该任务分配给新节点。全局服务的良好候选对象是监视代理、反病毒扫描器或希望在集群中的每个节点上运行的其他类型容器。

    命令--> 管理 --> api -->调度 --> 工作节点 (创建task容器维护创建)

    下图显示了一个黄色的三服务副本和一个灰色的全局服务。

    集群搭建

    集群规划:3台机器

    192.168.1.10 manager

    192.168.1.11 manager

    192.168.1.12 worker

    docker自带swarm功能,因此实验swarm命令来搭建集群

    1、生成主节点 192.168.1.10 init

    #查看帮助命令
    docker swarm --help
    Commands:
      ca          Display and rotate the root CA
      init        Initialize a swarm
      join        Join a swarm as a node and/or manager
      join-token  Manage join tokens
      leave       Leave the swarm
      unlock      Unlock swarm
      unlock-key  Manage the unlock key
      update      Update the swarm
    
    #初始化节点,使其称为第一个集群manager节点
    docker swarm init  --help
    #使节点成为主节点,使用私网地址,省流量费用
    docker swarm init --advertise-addr 192.168.1.10
    
    Swarm initialized: current node (txo876ujxzs76ncpbjwprtups) is now a manager.
    To add a worker to this swarm, run the following command:
        docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-5jku9lmca4m67k938zz79ehq7 192.168.1.10:2377
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
    #加入一个节点  docker swarm join
    #生成manager令牌 
    docker swarm join-token manager
    To add a manager to this swarm, run the following command:
        docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-0zjzpjor2o8ilrzntnwpqlyzv 192.168.1.10:2377
    
    #生成worker令牌 
    docker swarm join-token worker
    To add a worker to this swarm, run the following command:
        docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-5jku9lmca4m67k938zz79ehq7 192.168.1.10:2377
    #在需要加入集群的节点输入以上命令,节点即可加入集群
    
    

    2、加入集群 (manage、worker)

    #将192.168.1.11节点加入,同时作为manager
    docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-0zjzpjor2o8ilrzntnwpqlyzv 192.168.1.10:2377
    #将192.168.1.12节点加入加入成为worker
    docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-5jku9lmca4m67k938zz79ehq7 192.168.1.10:2377
    

    集群搭建完成。

    Raft协议

    Raft是一个分布式一致性协议/算法,是Replicated And Fault Tolerant的缩写。

    双主双从:如果一个节点挂掉会怎样?其他节点是否可以正常工作

    Raft:保证大多数节点存活才可用,集群至少大于3台

    实验:

    1、停止1台manage 节点的docker ,另一个节点也不能使用

    #stop 192.168.1.11节点的docker
    systemctl stop docker
    
    #192.168.1.10节点将不可用
    docker node ls
    Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
    
    #要使节点可用,需要重新强制初始化新的集群
    docker swarm init --advertise-addr 192.168.1.10 --force-new-cluster
    
    #再将192.168.1.11加入集群
    docker swarm join-token manager
    
    To add a manager to this swarm, run the following command:
        docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-0zjzpjor2o8ilrzntnwpqlyzv 192.168.1.10:2377
    
    docker node ls
    
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    txo876ujxzs76ncpbjwprtups *   node1      Ready     Active         Leader          20.10.4
    0s93se9yabmsk9zqymehzeoij     node2      Down      Active                         20.10.4
    r1p29vvcmx7684sidqg6ozttn     node2      Down      Active                         20.10.4
    vyyci26knpi2l3cng34rbytcm     node2      Ready     Active         Reachable       20.10.4
    ox6cq9c66i85crudisvd92kuy     node3      Ready     Active                         20.10.4
    
    

    2、将其他节点离开集群

    #节点离开集群
    docker swarm leave
    

    3、worker是工作节点,不能操作命令,

    docker service ps my-nginx
    Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
    

    小结:

    将管理节点增加到3台,保证 >1个节点存活,集群才可用

    弹性扩缩容

    docker-compose up 启动一个项目! --> 单机

    集群: swarm docker service

    容器 --> 服务 --> 副本 (同时开启)

    集群: 实现高可用, web--redis, 分布在3台机器,

    实验

    查看service帮助:创建服务,动态扩展服务,动态更新服务

    docker service --help
    Usage:  docker service COMMAND
    Manage services
    Commands:
      create      Create a new service
      inspect     Display detailed information on one or more services
      logs        Fetch the logs of a service or task
      ls          List services
      ps          List the tasks of one or more services
      rm          Remove one or more services
      rollback    Revert changes to a service's configuration
      scale       Scale one or multiple replicated services
      update      Update a service
    
    
    

    灰度发布:金丝雀发布

    发布nginx服务

    #查看create 帮助命令
    docker service create --help
    #创建nginx服务
    docker service create -p 8888:80 --name my-nginx nginx
    #查看my-nginx在那个节点启动
    docker service ps my-nginx
    ID    NAME        IMAGE         NODE   DESIRED STATE  CURRENT STATE        ERROR  PORTS
    o0tqau2qlgor  my-nginx.1  nginx:latest  node2  Running        Preparing 8 minutes ago     
    
    #查看运行的service
    docker service ls
    ID            NAME      MODE        REPLICAS  IMAGE
    od4ucb22q6pi  my-nginx  replicated  0/1       nginx:latest
    #查看运行的service 详细信息
    docker service inspect my-nginx
    

    弹性扩缩容

    #增加副本数
    docker service update --replicas 5 my-nginx
    1/5: preparing [=================================>                 ] 
    overall progress: 2 out of 5 tasks 
    1/5: preparing [=================================>                 ] 
    2/5: preparing [=================================>                 ] 
    3/5: running   [==================================================>] 
    4/5: running   [==================================================>] 
    5/5: preparing [=================================>     
    #增加副本数
    docker service scale my-nginx=5
    [root@node1 ~]# docker service scale my-nginx=5
    my-nginx scaled to 5
    overall progress: 5 out of 5 tasks 
    1/5: running   [==================================================>] 
    2/5: running   [==================================================>] 
    3/5: running   [==================================================>] 
    4/5: running   [==================================================>] 
    5/5: running   [==================================================>] 
    verify: Service converged 
    
    #移除服务
    docker service rm my-nginx
    my-nginx
    

    小结:

    docker run 容器启动,不具有扩缩容功能

    docker service 服务,具有扩缩容功能,滚动更新

    弹性扩缩容,实现服务的高可用

    Docker 概念总结:

    swarm

    集群的管理和编排,dockers可以初始化一个swarm集群,然后其他节点可以加入: manager + worker

    node

    就是一个docker节点,多个节点就组成一个网络集群: manager + worker

    service

    任务,可以在管理节点或工作节点来运行,核心!

    Task

    容器内的命令,细节任务

    命令--> 管理 --> api -->调度 --> 工作节点 (创建task容器维护创建)

    调整service 以什么方式运行

    --mode string
    
    docker service create --mode replicated --name mytomcat tomcat:7
    
    docker service create --mode global --name haha alpine ping baidu.com
    

    网络模式:

    PublishMode:

    overlay:

    ingress: 特殊的overlay网络,具有负载均衡功能

    docker network inspect ingress
    
    [
        {
            "Name": "ingress",
            "Id": "6k7m9h1paz80cwslxe5zpyfee",
            "Created": "2021-03-06T18:37:09.435832212+08:00",
            "Scope": "swarm",
            "Driver": "overlay",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "10.0.0.0/24",
                        "Gateway": "10.0.0.1"
                    }
                ]
            },
    ......
     "Labels": {},
            "Peers": [
                {
                    "Name": "a2d20f2da568",
                    "IP": "192.168.1.10"
                },
                {
                    "Name": "node2-0717d99ccecc",
                    "IP": "192.168.1.11"
                },
                {
                    "Name": "node3-0717d99ccecf",
                    "IP": "192.168.1.12"
                }
            ]
        }
    
    

    虽然docker安装在3台不同的集群,但是实际在同一个网络,

    Docker stack

    docker-compose 单机部署项目

    docker stack 部署,集群部署

    #单机
    docker-compose up -d wordpress.yaml
    
    #集群
    docker stack deploy  wordpress.yaml
    
    docker stack --help
    
    Usage:  docker stack [OPTIONS] COMMAND
    Manage Docker stacks
    Options:
          --orchestrator string   Orchestrator to use (swarm|kubernetes|all)
    Commands:
      deploy      Deploy a new stack or update an existing stack
      ls          List stacks
      ps          List the tasks in the stack
      rm          Remove one or more stacks
      services    List the services in the stack
    
    Run 'docker stack COMMAND --help' for more information on a command.
    
    

    Docker secret

    docker secret --help
    
    Usage:  docker secret COMMAND
    Manage Docker secrets
    Commands:
      create      Create a secret from a file or STDIN as content
      inspect     Display detailed information on one or more secrets
      ls          List secrets
      rm          Remove one or more secrets
    Run 'docker secret COMMAND --help' for more information on a command.
    

    Docker config

    docker config --help
    
    Usage:  docker config COMMAND
    Manage Docker configs
    Commands:
      create      Create a config from a file or STDIN
      inspect     Display detailed information on one or more configs
      ls          List configs
      rm          Remove one or more configs
    Run 'docker config COMMAND --help' for more information on a command.
    
    
    ***************用努力照亮现实的梦!***********************
  • 相关阅读:
    数据库高并发
    Syslog+Fluentd+InfluxDB日志收集系统搭建
    EFK Stack容器部署
    Logstash过滤插件
    Collectd+InfluxDB+Grafana监控系统搭建
    Collectd基本使用
    Haproxy配置详解
    Kafka基本使用
    HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串
    POJ-2752 Seek the Name, Seek the Fame 字符串问题 KMP算法 求前后缀串相同数木
  • 原文地址:https://www.cnblogs.com/orange2016/p/14493466.html
Copyright © 2011-2022 走看看