• Docker swarm 通过 docker-compose 部署应用


    Docker swarm 通过 docker-compose 部署应用


    1 初始化swarm

    默认情况下,Docker作为一个隔离的单节点工作。所有容器仅部署在引擎上。群模式将它变成了一个多主机集群感知引擎。

    为了使用秘密功能,Docker必须处于“群模式”。这是通过

    $ docker swarm init
    Swarm initialized: current node (ean4r3wx8dutbj2hlkp4lsfu0) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-2t5z3yzsmq4xlhilsuh04ltiprnqt1h1cv8gmmaq6eip3day99-advgpojck21b1hlh3v6vgpncq 172.17.0.86:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在第二台主机上执行下面的命令,将它作为一个worker添加到集群中。

    $ token=$(ssh -o StrictHostKeyChecking=no 172.17.0.86 "docker swarm join-token -q worker") && docker swarm join 172.17.0.86:2377 --token $token
    Warning: Permanently added '172.17.0.86' (ECDSA) to the list of known hosts.
    This node joined a swarm as a worker.
    
    • 1
    • 2
    • 3

    2. 创建 Docker Compose 文件

    使用Docker Compose v3,可以定义一个Docker部署以及生产细节。这为管理可以部署到集群模式集群中的应用程序部署提供了一个中央位置。

    一个Docker Compose文件已经创建,它定义了使用web前端部署Redis服务器。使用以下命令查看文件.

    $ cat docker-compose.yml
    version: "3"
    services:
      redis:
        image: redis:alpine
        volumes:
          - db-data:/data
        networks:
          appnet1:
            aliases:
              - db
        deploy:
          placement:
            constraints: [node.role == manager]
    
      web:
        image: katacoda/redis-node-docker-example
        networks:
          - appnet1
        depends_on:
          - redis
        deploy:
          mode: replicated
          replicas: 2
          labels: [APP=WEB]
          resources:
            limits:
              cpus: '0.25'
              memory: 512M
            reservations:
              cpus: '0.25'
              memory: 256M
          restart_policy:
            condition: on-failure
            delay: 5s
            max_attempts: 3
            window: 120s
          update_config:
            parallelism: 1
            delay: 10s
            failure_action: continue
            monitor: 60s
            max_failure_ratio: 0.3
          placement:
            constraints: [node.role == worker]
    
    networks:
        appnet1:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    该文件已扩展到利用群集部署选项。

    第一个配置选项使用depends_on。这意味着Redis必须在网络之前部署,并允许我们控制服务启动的顺序。

    下一个配置选项定义应该如何使用新的部署选项部署应用程序。

    首先,mode: replicatedreplicas: 2决定服务应该启动多少个replicas。
    其次,定义资源。限制是应用程序不能超过的硬限制,预留是Docker Swarm指示应用程序需要的资源的指南。

    第三,restart_policy指出进程崩溃时应该如何操作。

    第四,update_config定义如何应用和推出更新。

    最后,位置允许我们添加约束,以确定服务应该部署在哪里。
    更多docker-compose file文件配置细节请参考

    3. 部署服务

    Docker Compose文件被称为Docker Compose Stack。堆叠可以通过CLI部署到Swarm。
    docker stack命令用于通过Swarm部署docker Compose stack。在本例中,它将以myapp作为服务的前缀。

    $ docker stack deploy --compose-file docker-compose.yml myapp
    Creating network myapp_appnet1
    
    • 1
    • 2

    一旦部署完毕,就可以使用CLI检查状态。

    $ docker stack ls
    NAME                SERVICES            ORCHESTRATOR
    myapp               2                   Swarm
    
    • 1
    • 2
    • 3

    可以通过以下方式发现内部服务的详细信息

    $ docker stack services myapp
    ID                  NAME                MODE                REPLICAS            IMAGE                                       PORTS
    l8c8oztncboc        myapp_web           replicated          2/2                 katacoda/redis-node-docker-example:latest   
    
    • 1
    • 2
    • 3

    注意,该命令指示服务的Desired / Running状态。如果不能部署服务,那么这将是不同的。
    每个服务容器的详细信息可以使用

    $ docker stack ps myapp
    ID                  NAME                IMAGE                                       NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
    x90dytk7svj7        myapp_web.1         katacoda/redis-node-docker-example:latest   host02              Running             Running 3 minutes ago                       
    92a3t08318ne        myapp_redis.1       redis:alpine                                host01              Running             Running 3 minutes ago                       
    ikmrz4pufzyd        myapp_web.2         katacoda/redis-node-docker-example:latest   host02              Running             Running 3 minutes ago                       
    
    • 1
    • 2
    • 3
    • 4
    • 5

    所有这些信息仍然可以被发现使用

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    21bbc04a9e8d        redis:alpine        "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        6379/tcp            myapp_redis.1.92a3t08318neq5g5sd1akrwzo
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Linux进程控制
    【Yocto2】构建嵌入式Linux系统
    Faster Rcnn
    【高等数学基础进阶】常微分方程-part1
    Java - Hashtable原理分析
    【Numpy总结】强烈推荐。超实用Numpy学习目录,一篇学会Numpy
    milvus采坑一:启动服务就会挂掉
    骑行运动耳机哪个好,列举几款与运动最符合的耳机清单
    Redisson 的主要方法
    JVM及其垃圾回收机制(GC)
  • 原文地址:https://blog.csdn.net/xixihahalelehehe/article/details/125599120