Deploy a stack to a swarm

预计阅读时间:7分钟

在 swarm 模式下运行 Docker Engine 时,您可以使用docker stack deploy将完整的应用程序堆栈部署到 swarm. deploy命令接受Compose 文件形式的堆栈描述.

docker stack deploy命令支持任何"3.0"或更高版本的 Compose 文件. 如果您有旧版本,请参阅升级指南.

要完成本教程,您需要:

  1. swarm 模式运行的 Docker 引擎. 如果您不熟悉 swarm 模式,您可能需要阅读Swarm 模式关键概念服务工作原理.

    Note

    如果您在本地开发环境中尝试,您可以使用docker swarm init将引擎置于 swarm 模式.

    如果您已经运行了多节点集群,请记住所有docker stackdocker service命令必须从管理器节点运行.

  2. 当前版本的Docker Compose .

Set up a Docker registry

因为一个 swarm 由多个 Docker 引擎组成,所以需要一个注册表来将图像分发给所有这些引擎. 您可以使用Docker Hub或维护自己的. 以下是创建一次性注册表的方法,您可以在之后将其丢弃.

  1. 在您的 swarm 上将注册表作为服务启动:

    $ docker service create --name registry --publish published=5000,target=5000 registry:2
    
  2. 使用docker service ls检查其状态:

    $ docker service ls
    
    ID            NAME      REPLICAS  IMAGE                                                                               COMMAND
    l7791tpuwkco  registry  1/1       registry:2@sha256:1152291c7f93a4ea2ddc95e46d142c31e743b6dd70e194af9e6ebe530f782c17
    

    一旦它在REPLICAS下读取1/1 ,它就会运行. 如果它读取0/1 ,它可能仍在拉动图像.

  3. 检查它是否与curl一起使用:

    $ curl http://localhost:5000/v2/
    
    {}
    

Create the example application

本指南中使用的应用程序基于Docker Compose入门指南中的命中计数器应用程序. 它由一个 Python 应用程序组成,该应用程序在 Redis 实例中维护一个计数器,并在您访问它时递增计数器.

  1. 为项目创建一个目录:

    $ mkdir stackdemo
    $ cd stackdemo
    
  2. 在项目目录中创建一个名为app.py的文件并将其粘贴到:

    from flask import Flask
    from redis import Redis
    
    app = Flask(__name__)
    redis = Redis(host='redis', port=6379)
    
    @app.route('/')
    def hello():
        count = redis.incr('hits')
        return 'Hello World! I have been seen {} times.\n'.format(count)
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=8000, debug=True)
    
  3. 创建一个名为requirements.txt的文件并将这两行粘贴到:

    flask
    redis
    
  4. 创建一个名为Dockerfile的文件并将其粘贴到:

    # syntax=docker/dockerfile:1
    FROM python:3.4-alpine
    ADD . /code
    WORKDIR /code
    RUN pip install -r requirements.txt
    CMD ["python", "app.py"]
    
  5. 创建一个名为docker-compose.yml的文件并将其粘贴到:

    version: "3.9"
    
    services:
      web:
        image: 127.0.0.1:5000/stackdemo
        build: .
        ports:
          - "8000:8000"
      redis:
        image: redis:alpine
    

    Web 应用程序的映像是使用上面定义的 Dockerfile 构建的. 它还标有127.0.0.1:5000 - 之前创建的注册表地址. 这在将应用程序分发到 swarm 时很重要.

Test the app with Compose

  1. 使用docker-compose up启动应用程序. 这将构建 Web 应用程序映像,如果您还没有 Redis 映像,则拉取它,并创建两个容器.

    您会看到有关引擎处于集群模式的警告. 这是因为 Compose 没有利用 swarm 模式,而是将所有内容部署到单个节点. 您可以放心地忽略这一点.

    $ docker-compose up -d
    
    WARNING: The Docker Engine you're using is running in swarm mode.
    
    Compose does not use swarm mode to deploy services to multiple nodes in
    a swarm. All containers are scheduled on the current node.
    
    To deploy your application across the swarm, use `docker stack deploy`.
    
    Creating network "stackdemo_default" with the default driver
    Building web
    ...(build output)...
    Creating stackdemo_redis_1
    Creating stackdemo_web_1
    
  2. 检查应用程序是否正在使用docker-compose ps运行:

    $ docker-compose ps
    
          Name                     Command               State           Ports
    -----------------------------------------------------------------------------------
    stackdemo_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
    stackdemo_web_1     python app.py                    Up      0.0.0.0:8000->8000/tcp
    

    您可以使用curl测试应用程序:

    $ curl http://localhost:8000
    Hello World! I have been seen 1 times.
    
    $ curl http://localhost:8000
    Hello World! I have been seen 2 times.
    
    $ curl http://localhost:8000
    Hello World! I have been seen 3 times.
    
  3. 关闭应用程序:

    $ docker-compose down --volumes
    
    Stopping stackdemo_web_1 ... done
    Stopping stackdemo_redis_1 ... done
    Removing stackdemo_web_1 ... done
    Removing stackdemo_redis_1 ... done
    Removing network stackdemo_default
    

Push the generated image to the registry

要在 swarm 中分发 Web 应用程序的映像,需要将其推送到您之前设置的注册表. 使用 Compose,这非常简单:

$ docker-compose push

Pushing web (127.0.0.1:5000/stackdemo:latest)...
The push refers to a repository [127.0.0.1:5000/stackdemo]
5b5a49501a76: Pushed
be44185ce609: Pushed
bd7330a79bcf: Pushed
c9fc143a069a: Pushed
011b303988d2: Pushed
latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372

堆栈现在可以部署了.

Deploy the stack to the swarm

  1. 使用docker stack deploy创建堆栈:

    $ docker stack deploy --compose-file docker-compose.yml stackdemo
    
    Ignoring unsupported options: build
    
    Creating network stackdemo_default
    Creating service stackdemo_web
    Creating service stackdemo_redis
    

    最后一个参数是堆栈的名称. 每个网络、卷和服务名称都以堆栈名称为前缀.

  2. 检查它是否与docker stack services stackdemo运行:

    $ docker stack services stackdemo
    
    ID            NAME             MODE        REPLICAS  IMAGE
    orvjk2263y1p  stackdemo_redis  replicated  1/1       redis:3.2-alpine@sha256:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86d
    s1nf0xy8t1un  stackdemo_web    replicated  1/1       127.0.0.1:5000/stackdemo@sha256:adb070e0805d04ba2f92c724298370b7a4eb19860222120d43e0f6351ddbc26f
    

    运行后,您应该在REPLICAS下看到两个服务的1/1 . 如果您有一个多节点集群,这可能需要一些时间,因为需要提取图像.

    和以前一样,您可以使用curl测试应用程序:

    $ curl http://localhost:8000
    Hello World! I have been seen 1 times.
    
    $ curl http://localhost:8000
    Hello World! I have been seen 2 times.
    
    $ curl http://localhost:8000
    Hello World! I have been seen 3 times.
    

    多亏了 Docker 的内置路由网格,您可以访问 swarm 中的 8000 端口上的任何节点并被路由到应用程序:

    $ curl http://address-of-other-node:8000
    Hello World! I have been seen 4 times.
    
  3. 使用docker stack rm降低堆栈:

    $ docker stack rm stackdemo
    
    Removing service stackdemo_web
    Removing service stackdemo_redis
    Removing network stackdemo_default
    
  4. 使用docker service rm关闭注册表:

    $ docker service rm registry
    
  5. 如果您只是在本地机器上进行测试并希望将 Docker 引擎退出 swarm 模式,请使用docker swarm leave

    $ docker swarm leave --force
    
    Node left the swarm.
    
guide, 群模式, composefile, stack, compose, deploy

by  icopy.site