美文网首页Java
Docker Stack介绍及使用入门

Docker Stack介绍及使用入门

作者: 文景大大 | 来源:发表于2021-12-30 17:58 被阅读0次

    一、Stack介绍

    在前面的文章中,我们介绍Docker Compose,缺点是不能在分布式多机器上使用;我们还介绍了Docker swarm,缺点是不能同时编排多个服务,所以才有了Docker Stack,可以在分布式多机器上同时编排多个服务。

    二、使用实例

    2.1 案例准备

    我们使用前面文章《Docker Compose介绍及使用入门》中的2.3节的案例进行如下Docker Stack的演示。

    父工程demo包含两个子工程:

    • service1

      • controller

        @Slf4j
        @RestController
        public class HelloRest {
            @GetMapping("/service1/getHello")
            public String getHello(){
                log.info("service1!!!");
                return "hello from service1";
            }
        }
        
      • dockerfile

        FROM openjdk:8
        EXPOSE 8080
        ADD  target/service1-0.0.1-SNAPSHOT.jar /demo.jar
        ENTRYPOINT ["java", "-jar", "demo.jar"]
        
    • service2

      • controller

        @Slf4j
        @RestController
        public class HelloRest {
            @GetMapping("/service2/getHello")
            public String getHello(){
                log.info("service2!!!");
                return "hello from service2";
            }
        }
        
      • dockerfile

        FROM openjdk:8
        EXPOSE 8081
        ADD  target/service2-0.0.1-SNAPSHOT.jar /demo.jar
        ENTRYPOINT ["java", "-jar", "demo.jar"]
        

    务必确保两个子工程可以正常运行再进行下面的操作。

    2.2 打包镜像

    分别在service1和service2目录下执行如下命令,分别打包镜像:

    docker build -t service1:V1 .
    docker build -t service2:V1 .
    

    然后执行docker images查看一下镜像是否正常创建成功:

    >docker images
    REPOSITORY                                            TAG           IMAGE ID       CREATED          SIZE
    service1                                              V1            a0ccc239fe29   22 minutes ago   544MB
    service2                                              V1            2100104dd6eb   22 minutes ago   544MB
    

    2.3 镜像迁移

    我自己需要将本地创建好的docker镜像service1和service2迁移到远程的阿里云服务器上,因为docker swarm集群都是在上面搭建的,后面docker stack实验的进行也是在上面进行。

    方式一:推送和拉取

    # 推送到官方Docker Hub必须要有用户名前缀
    docker tag service1:V1 m***g/service1:V1
    docker tag service2:V1 m***g/service2:V1
    docker push masonzhang/service1:V1
    docker push masonzhang/service2:V1
    

    然后登录自己的Docker Hub账户检查下镜像是否成功push了。如果OK的话,那么登录阿里云的远程服务器,执行如下的镜像pull操作。

    docker pull m***g/service1:V1
    docker pull m***g/service2:V1
    

    然后执行docker images查看镜像是否导入成功。

    方式二:导出和导入

    # 导出镜像到指定的目录
    >docker save -o E:\service1.zip service1:V1
    >docker save -o E:\service2.zip service2:V1
    

    然后我们将这两个镜像通过远程SFTP的方式上传到服务器上,存放的目录为/root/docker-images-zip,再执行如下的命令就可以将这两个镜像加载到远程服务器的本地镜像仓库中了。

    docker load -i /root/docker-images-zip/service1.zip
    docker load -i /root/docker-images-zip/service2.zip
    

    然后执行docker images查看镜像是否导入成功。

    2.4 编写compose

    本地有这两个镜像之后,我们编写compose文件内容如下,文件路径及文件名为/root/docker-compose.yml

    version: "3.9"
    services:
      service1:
        image: "masonzhang/service1:V1"
        deploy:
            replicas: 2
        ports:
          - "8080:8080"
    
      service2:
        image: "masonzhang/service2:V1"
        deploy:
            replicas: 3
        ports:
          - "8081:8081"
    

    2.5 swarm集群搭建

    以有service1和service2镜像的服务器为manager,其它机器为worker node节点,具体的搭建过程在先前文章中讲过了,可以参考Docker Swarm介绍及使用入门 - 简书 (jianshu.com)

    2.6 stack部署

    然后,我们就可以开始使用stack进行集群部署了。

    # myapps是stack的自定义名称,使用具体路径的compose配置文件进行部署
    docker stack deploy myapps --compose-file=/root/docker-compose.yml
    Creating network myapps_default
    Creating service myapps_service1
    Creating service myapps_service2
    

    2.7 stack其它操作

    创建完成后,我们可以通过如下命令查看stack及服务的信息:

    # 查看所有stack的信息
    docker stack ls
    NAME      SERVICES   ORCHESTRATOR
    myapps    2          Swarm
    
    # 查看某个stack中的所有任务信息
    docker stack ps myapps
    ID             NAME                IMAGE                    NODE      DESIRED STATE   CURRENT STATE
    tvvujrf3qcr1   myapps_service1.1   masonzhang/service1:V1   node1     Running         Running 46 seconds ago       
    igjeydmmvzzm   myapps_service1.2   masonzhang/service1:V1   manager   Running         Running 46 seconds ago       
    7p5c96eplwl3   myapps_service2.1   masonzhang/service2:V1   node1     Running         Running 34 seconds ago       
    7shglsajip5d   myapps_service2.2   masonzhang/service2:V1   manager   Running         Running 39 seconds ago       
    upo0mr7j9tn1   myapps_service2.3   masonzhang/service2:V1   node2     Running         Preparing 41 seconds ago  
    
    # 查看某个stack中的所有服务信息
    docker stack services myapps
    ID             NAME              MODE         REPLICAS   IMAGE                    PORTS
    icz3kjn0skb3   myapps_service1   replicated   2/2        masonzhang/service1:V1   *:8080->8080/tcp
    myuzlwnrxag4   myapps_service2   replicated   3/3        masonzhang/service2:V1   *:8081->8081/tcp
    
    # 移除stack
    docker stack rm myapps
    Removing service myapps_service1
    Removing service myapps_service2
    Removing network myapps_default
    

    三、参考文档

    Docker Compose介绍及使用入门 - 简书 (jianshu.com)

    Docker Swarm介绍及使用入门 - 简书 (jianshu.com)

    docker stack deploy | Docker Documentation

    Docker常用命令大全 - 简书 (jianshu.com)

    docker-stack一键编排lnmp - 知乎 (zhihu.com)

    相关文章

      网友评论

        本文标题:Docker Stack介绍及使用入门

        本文链接:https://www.haomeiwen.com/subject/vbtwqrtx.html