zoukankan      html  css  js  c++  java
  • 走进dockerswarm 带大家快速掌握docker自带编排工具

    什么是Docker Swarm?

    • 对比Docker

    前面我们介绍过Docker可以理解成是一个我们的服务的独立运行的容器,那么在实际工作中,我们的系统可能是一个微服务应用,系统中根据业务拆分成多个模块,可以理解一个模块对应一组运行着相同镜像的的Docker容器,这就是单个Docker,而Swarm就是这个系统中,能够管理所有的容器之间的路由、负载均衡、服务发现,以及容器的伸缩(可以理解为我们一个服务进行扩/缩容)、日志、配置文件的编排工具。

    • 对比Docker-Compose

    Docker-Compose类似与我们生活中的管家,它仅仅能够管理一个主机上的所有容器,他可以一次性启动多个容器。而Docker-Swarm可以跨主机去管理多个容器,并且当一个容器状态异常时候可以快速在其他机器上启动容器,保证服务的高可用!

    • 对比Kubernetes

    Kubernetes它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,都是一个跨主机的容器管理平台,当然也有自己一些不一样的特点,k8s是谷歌公司根据自身的多年的运维经验研发的一款容器管理平台。而Docker Swarm则是由Docker 公司研发的。Kubernetes在Docker基础上封装了一层概念,所以他的功能相对于Swarm更强大,但是运维更复杂,Swarm则更容易上手。

    综上所述大家应该知道Docker就是一个容器,Docker-Compose是一个单主机的编排工具,Docker-Swarm是一个多主机的编排工具!

    swarm
    swarm
    • Swarm架构组成
      • Docker Api 是基于Docker去管理容器
      • Swarm Manage CLi 是Swarm集群管理Api
      • Leadership 这个是Swarm提供的HA
      • Scheduler 则是Swarm的调度策略,以及过滤规则管理
      • Discovery Service 管理每个容器的服务的注册、发现
    结构图
    结构图
    • Swarm如何工作? Swarm节点分为管理节点(manager)跟 工作节点(worker),管理节点主要用于swarm集群的管理(也可以设置执行任务工作),Docker Swarm命令只能在管理节点上去操作,一个集群可以存在多个管理节点,但是只有一个管理节点可以成为Leader。工作节点是任务执行节点。
      • Manager节点:
        1. 处理集群管理任务
        2. 维护集群状态
        3. 调度服务
        4. Swarm 提供外部可调用的 API 接口
      • Worker节点: 实际执行我们服务的Docker容器
    执行图
    执行图

    Docker Swarm命令

    • 初始化集群
    $ docker swarm init --advertise-addr 192.168.99.121
    Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.

    To add a worker to this swarm, run the following command:

        docker swarm join \
        --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
        172.17.0.2:2377

    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    • 加入集群
    # 加入worker 
    $ docker swarm join-token worker


    To add a worker to this swarm, run the following command:
        docker swarm join \
        --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
        172.17.0.2:2377
    # 加入manager 
    $ docker swarm join-token manager

    To add a manager to this swarm, run the following command:

        docker swarm join \
        --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 \
        172.17.0.2:2377
    • 离开集群
    # --force / -f 强制离开
    $ docker swarm leave -f
    Node left the default swarm.
    • 查看集群节点信息
    docker@manager:~$ docker node ls                                                                                                                                                          
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    alz0od3rbkg552mkicfuezhkn *   manager             Ready               Active              Leader              19.03.12
    jxf5u2hnurrgz90vnd9ay3y7p     node-1              Ready               Active                                  19.03.12
    lldvm2slseyodo0t7ath5tzne     node-2              Ready               Active                                  19.03.12

    • swarm集群中创建服务
    docker service create --name redis redis:3.0.6

    dmu1ept4cxcfe8k8lhtux3ro3

    $ docker service create --mode global --name redis2 redis:3.0.6

    a8q9dasaafudfs8q8w32udass

    $ docker service ls

    ID            NAME    MODE        REPLICAS  IMAGE
    dmu1ept4cxcf  redis   replicated  1/1       redis:3.0.6
    a8q9dasaafud  redis2  global      1/1       redis:3.0.6
    • 查看swarm集群服务信息
    $ docker service inspect redis
    • 查看服务的日志
    $ docker service logs -f redis

    • 查看启动所有服务
    $ docker service ls 
    ID            NAME      MODE            REPLICAS             IMAGE
    c8wgl7q4ndfd  frontend  replicated      5/5                  nginx:alpine
    dmu1ept4cxcf  redis     replicated      3/3                  redis:3.0.6
    iwe3278osahj  mongo     global          7/7                  mongo:3.3
    hh08h9uu8uwr  job       replicated-job  1/1 (3/5 completed)  nginx:latest

    • 查看服务启动的具体容器
    $ docker service ps redis

    ID             NAME      IMAGE        NODE      DESIRED STATE  CURRENT STATE          ERROR  PORTS
    0qihejybwf1x   redis.1   redis:3.0.5  manager1  Running        Running 8 seconds
    bk658fpbex0d   redis.2   redis:3.0.5  worker2   Running        Running 9 seconds
    5ls5s5fldaqg   redis.3   redis:3.0.5  worker1   Running        Running 9 seconds
    • 删除服务
    $ docker service rm redis

    redis

    $ docker service ls

    ID  NAME  MODE  REPLICAS  IMAGE
    • 扩容/缩容服务(可以动态添加服务提供节点,在swarm节点集群中启动) docker service create --mode global ... : 启动服务️定--mode global 则不能使用此命令,global创建一个服务会在每个节点都启动一个
    # frontend服务扩容50个节点
    $ docker service scale frontend=50

    frontend scaled to 50
    • 指定参数更新 具体参考 https://docs.docker.com/engine/reference/commandline/service_update/

    Swarm实战演练

    使用Dcoker-Machine创建3台虚拟机

    1.创建三台主机

    docker-machine create --driver=virtualbox  manager
    docker-machine create --driver=virtualbox  node-1
    docker-machine create --driver=virtualbox  node-2

    [root@docker ~]# docker-machine ls
    NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER      ERRORS
    manager   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.12   
    node-1    -        virtualbox   Running   tcp://192.168.99.103:2376           v19.03.12   
    node-2    -        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.12  

    2.创建好主机后初始化Swarm manager节点

    [root@docker ~]# docker-machine ssh manager
       ( '>')
      /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
     (/-_--_-\)           www.tinycorelinux.net

    # --advertise-addr 改成 manager 节点ip
    docker@manager:~$   docker swarm init --advertise-addr 192.168.99.100  
    Swarm initialized: current node (alz0od3rbkg552mkicfuezhkn) is now a manager.

    To add a worker to this swarm, run the following command:

        docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377

    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

    这样就初始化好了manager是不是很简单?

    3.切换node-1、node-2加入集群


    # node-1加入swarm集群、
    [root@docker ~]# docker-machine ssh node-1
       ( '>')
      /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
     (/-_--_-\)           www.tinycorelinux.net

    docker@node-1:~$ docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
    This node joined a swarm as a worker.


    #node-2加入swarm集群
    [root@docker ~]# docker-machine ssh node-2
       ( '>')
      /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
     (/-_--_-\)           www.tinycorelinux.net

    docker@node-2:~$     docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
    This node joined a swarm as a worker

    1. 在manager查看当前集群node状态
    docker@manager:~$ docker node ls                                                                                                                                                          
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    alz0od3rbkg552mkicfuezhkn *   manager             Ready               Active              Leader              19.03.12
    jxf5u2hnurrgz90vnd9ay3y7p     node-1              Ready               Active                                  19.03.12
    lldvm2slseyodo0t7ath5tzne     node-2              Ready               Active                                  19.03.12
    1. 创建一个nginx服务包含3个副本
    # --replicas 指定容器个例数
    docker@manager:~$ docker service create  --name test-nginx --publish 8080:80  --replicas=3 nginx
    ya3q60llnj62w141aaekggyl2
    overall progress: 3 out of 3 tasks 
    1/3: running   [==================================================>] 
    2/3: running   [==================================================>] 
    3/3: running   [==================================================>] 
    verify: Service converged 
    docker@manager:~$ docker service ls                                                                                                                                                       
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    ya3q60llnj62        test-nginx          replicated          3/3                 nginx:latest        *:8080->80/tcp

    这时候创建好了3个nginx服务,这时候我们只要访问manager的ip:8080 则可以随机访问任意一个nginx服务,是不是类似nginx的负载均衡?

    # 发送多次请求nginx服务
    curl 192.168.99.100:8080
    #查看日志
    docker@manager:~$ docker service logs -f ya3q60llnj62                                                                                                                                     
    test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    test-nginx.1.h50ridnlpsim@node-2    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    test-nginx.1.h50ridnlpsim@node-2    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Configuration complete; ready for start up
    test-nginx.1.h50ridnlpsim@node-2    | 10.0.0.2 - - [25/Mar/2021:14:59:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    test-nginx.1.h50ridnlpsim@node-2    | 10.0.0.2 - - [25/Mar/2021:14:59:33 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    test-nginx.3.mw75ab00bfs1@node-1    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    test-nginx.3.mw75ab00bfs1@node-1    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Configuration complete; ready for start up
    test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:28 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:34 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    test-nginx.2.drsv2s4cnf9y@manager    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    test-nginx.2.drsv2s4cnf9y@manager    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Configuration complete; ready for start up
    test-nginx.2.drsv2s4cnf9y@manager    | 10.0.0.2 - - [25/Mar/2021:14:59:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    test-nginx.2.drsv2s4cnf9y@manager    | 10.0.0.2 - - [25/Mar/2021:14:59:32 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

    至此所有请求负载到后端3个nginx服务上。

    结束

    下篇结合微服务说swarm如何可以代替微服务的功能!

    欢迎关注公众号! 公众号回复:入群 ,扫码加入我们交流群! 扫码关注公众号获取更多学习资料

    欢迎关注我的公众号!里面可以加入微信技术交流群!
  • 相关阅读:
    陶瓷电容的结构、工艺、失效模式
    Vue.js最佳实践
    Vue 超快速学习
    CSS 小技巧
    HTML5 Canvas
    webkit下面的CSS设置滚动条
    Some untracked working tree files would be overwritten by checkout. Please move or remove them before you can checkout. View them
    JSCS: Please specify path to 'JSCS' package
    React中ref的使用方法
    React 60S倒计时
  • 原文地址:https://www.cnblogs.com/1ssqq1lxr/p/14596172.html
Copyright © 2011-2022 走看看