zoukankan      html  css  js  c++  java
  • Docker Swarm 从入门到放弃

    image.png

    准备工作

    我本机是macOS,所以我直接安装了docker desktop,其中包含了docker-machine,不用单独安装。
    image.png

    安装docker主机驱动

    我在网上很多人提到了使用virtualbox,太重量级了,我安装了xhyve,更轻量级。

    brew install docker-machine-driver-xhyve
    

    下载boot2docker.iso

    如果不安装的话第一次执行docker-machine create 速度会很慢,你懂得哦。所以在github上下载boot2docker.iso, 然后拷贝到对应目录下,我的主机目录(/Users/zhangfei/.docker/machine/cache),

    创建docker主机

    创建docker主机我们用到docker-machine 命令,这也是docker三剑客之一的命令。

    查看主机

    docker-machine ls
    

    创建主机

    # xhyve驱动
    docker-machine create -d xhyve test1
    # virtualbox驱动
    docker-machine create -d virtualbox test1
    

    image.png

    进入主机

    docker-machine ssh test1
    

    退出主机

    docker@test1:exit
    

    创建swarm集群

    创建三台docker主机

    docker-machine create -d xhyve manager1 &&
    docker-machine create -d xhyve worker-1 &&
    docker-machine create -d xhyve worker-2 
    

    配置集群节点

    执行以下命令,这里是在manager1主机上使用docker swarm创建一个管理节点,初始化集群的时候会自动把当前节点设置为管理员节点。

    bogon:~ zhangfei$ docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.64.2"
    Swarm initialized: current node (5lyi9tkwqyugnk9626f5jhamy) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
    

    接着在worer1和worker2节点上创建worker节点,并加入集群,上面已经给出了提示命令。

    bogon:~ zhangfei$ docker-machine ssh worker1 "docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377"
    This node joined a swarm as a worker.
    bogon:~ zhangfei$ docker-machine ssh worker2 "docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377"
    This node joined a swarm as a worker.
    bogon:~ zhangfei$ 
    

    查看集群节点信息

    docker@manager1:~$ docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    5lyi9tkwqyugnk9626f5jhamy *   manager1            Ready               Active              Leader              19.03.5
    r01xh6k73cj24yqrmtau3bsqf     worker1             Ready               Active                                  19.03.5
    5hkzm4ogghgbt6bale2bo7lf5     worker2             Ready               Active                                  19.03.5
    docker@manager1:~$   
    

    OK,到这里我们就创建一个最小的Swarm集群,包含一个管理节点和两个工作节点。

    docker service部署单个集群服务

    我们使用docker service命令来管理swarm集群中的服务,该命令只能在管理节点上执行, 这里我们使用nginx作为测试镜像,我这里会拉去nginx最新版本,拉取之前,我们先在3台docker主机上配置国内镜像地址,要不然拉取官方镜像的话会很慢。

    #在三台主机上以此执行
    docker@manager1:~$ sudo touch /etc/docker/daemon.json &&
    > sudo chmod 777 /etc/docker/daemon.json &&
    > sudo echo '{ "registry-mirrors": ["http://hub-mirror.c.163.com"]}' > /etc/docker/daemon.json
    
    #修改完镜像地址后重启三台docker主机
    docker-machine restart manager1 &&
    docker-machine restart worker1 &&
    docker-machine restart worker2 
    

    #docker service 拉取nginx镜像
    docker@manager1:~$ docker service create --replicas 3 -p 8088:80 --name nginx nginx:latest
    

    #也可以使用scale命令手动扩展服务个数
    docker@manager1:~$ docker service scale 3
    
    #服务部署好查看服务
    docker@manager1:~$ docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    ja2xjj0dn08m        nginx               replicated          3/3                 nginx:latest        *:8088->80/tcp
    
    docker@manager1:~$ docker service ps nginx
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
    py9f7w78a95c        nginx.1             nginx:latest        manager1            Running             Running 12 minutes ago                       
    ghv07io2w1hv        nginx.2             nginx:latest        worker1             Running             Running 12 minutes ago                       
    y00d8c0xadil        nginx.3             nginx:latest        worker2             Running             Running 12 minutes ago
    

    三个服务部署好以后,可以使用三台机器任一ip查看nginx服务。

    image.png

    从集群中移除服务

    docker@manager1:~$ docker service rm nginx
    

    docker stack部署多个集群服务

    docker service只能部署单个服务,部署多个服务的话则需要用到docker stack, 这里同样要使用到docker-compose.yml配置文件,docker-compose是在单机环境提供多容器编排工具,结合docker stack则实现了多主机容器编排服务。
    先来创建docker-compose.yml文件,创建两个服务,一个是asp.net core的测试镜像,另一个是nginx,这里需要在管理节点创建yml文件。

    version: "3"
    
    services:
     aspnetcore:
       image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
       ports:
         - 8088:80
       deploy:
         mode: replicated
         replicas: 3
    
     nginx:
        image: nginx:latest
        ports:
          - 8087:80
        deploy:
          mode: replicated
          replicas: 3 
    

    如上所述,总共部署了两个服务,然后执行docker stack deploy命令。

    docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-test
    Creating network deploy-test_default
    Creating service deploy-test_aspnetcore
    Creating service deploy-test_nginx
    

    查看服务

    docker@manager1:~$ docker service ls
    ID                  NAME                     MODE                REPLICAS            IMAGE                                             PORTS
    8au30q7tblq0        deploy-test_aspnetcore   replicated          3/3                 mcr.microsoft.com/dotnet/core/samples:aspnetapp   *:8088->80/tcp
    367gpz567iiv        deploy-test_nginx        replicated          3/3                 nginx:latest                                      *:8087->80/tcp
    

    查看到服务名称,然后可以根据服务名称查看服务运行状况

    docker@manager1:~$ docker service ps deploy-test_nginx
    ID                  NAME                  IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
    ov75hjkdux6i        deploy-test_nginx.1   nginx:latest        worker1             Running             Running 27 seconds ago                       
    bcq2zw5p33cb        deploy-test_nginx.2   nginx:latest        worker2             Running             Running 27 seconds ago                       
    cfhbisbab3op        deploy-test_nginx.3   nginx:latest        manager1            Running             Running 27 seconds ago 
    

    到这一步,我们可以打开三台主机的任意一台,看下8088端口和8087端口的服务。
    asp.net core 服务
    image.png
    nginx服务

    image.pngGUI管理页面

    当然,如果说要用于生产环境中,又或者是像通过更直观的方式观察容器或者服务的运行情况,我们肯定离不开可视化界面,这里推荐两个可视化工具**visualizer,portainer,  **我更新本地的docker-compose.yml,把portainer更新进去,portainer相比visualizer,功能更强大些,可支持在管理界面上操作服务。
             可视化工具只需要安装在管理节点上即可。

    version: "3"
    
    services:
     aspnetcore:
       image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
       ports:
         - 8088:80
       deploy:
         mode: replicated
         replicas: 3
    
     nginx:
        image: nginx:latest
        ports:
          - 8087:80
        deploy:
          mode: replicated
          replicas: 3
    
     portainer:
        image: portainer/portainer:latest
        ports:
          - "9000:9000"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          replicas: 1
          placement:
            constraints: [node.role == manager]  
    
    #先暂停stack
    docker@manager1:~$ docker stack down deploy-test
    Removing service deploy-test_aspnetcore
    Removing service deploy-test_nginx
    Removing network deploy-test_default
    
    #启动stack
    docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-test
    

    WX20200205-223240@2x.png

    WX20200205-223314@2x.png

    总结

    在测试可视化工具时,我先使用visualizer,stack命令执行后Rurrent State一直是Preparing, 也就是说服务一直起不来,不知道什么情况,猜测可能是镜像问题,然后换了另一个portainer时就好了,证明确实是那个镜像有问题,这里感谢纯洁的微笑大哥和蟋蟀大哥的文章,学习了docker swarm相关。

    参考

    https://github.com/machine-drivers/docker-machine-driver-xhyve
    https://www.cnblogs.com/guge-94/p/11102076.html
    https://blog.csdn.net/Enjolras_fuu/article/details/89244113
    https://www.cnblogs.com/xishuai/p/docker-swarm.html

  • 相关阅读:
    为什么要学习Linux
    测试开发技术:DOM中 innerHTML、innerText、outerHTML、outerText的区别
    web service 组件
    老李分享:webservice是什么?
    hibernate 和 mybatis 的区别
    mybatis 缓存
    过滤器和拦截器
    Spring 注解
    Spring 全局异常处理
    mybatis Mapper XML 映射文件
  • 原文地址:https://www.cnblogs.com/sword-successful/p/12267163.html
Copyright © 2011-2022 走看看