将堆栈部署到 swarm
当在 Swarm 模式下运行 Docker Engine 时,您可以使用docker stack deploy
它将完整的应用程序堆栈部署到 Swarm。该命令接受Compose 文件deploy
形式的堆栈描述
。
笔记
该命令使用 Compose V1 使用的
docker stack deploy
旧版 Compose 文件版本 3格式。 Compose 规范定义的最新格式 与该命令不兼容docker stack deploy
。有关 Compose 演变的更多信息,请参阅 Compose 的历史。
要完成本教程,您需要:
以Swarm 模式运行的 Docker 引擎 。如果您不熟悉 Swarm 模式,您可能需要阅读 Swarm 模式关键概念 和 服务如何工作。
笔记
如果您正在本地开发环境中进行尝试,您可以使用
docker swarm init
.如果您已经运行了多节点群,请记住所有
docker stack
命令都docker service
必须从管理器节点运行。Docker Compose的当前版本。
设置 Docker 注册表
由于 Swarm 由多个 Docker 引擎组成,因此需要一个注册表来将镜像分发给所有这些引擎。您可以使用 Docker Hub或维护自己的Docker Hub 。以下是创建一次性注册表的方法,您可以在以后将其丢弃。
将注册表作为集群上的服务启动:
$ docker service create --name registry --publish published=5000,target=5000 registry:2
使用以下命令检查其状态
docker service ls
:$ docker service ls ID NAME REPLICAS IMAGE COMMAND l7791tpuwkco registry 1/1 registry:2@sha256:1152291c7f93a4ea2ddc95e46d142c31e743b6dd70e194af9e6ebe530f782c17
一旦它读到
1/1
下面REPLICAS
,它就正在运行。如果显示为0/1
,则可能仍在拉取图像。检查它是否正在使用
curl
:$ curl http://localhost:5000/v2/ {}
创建示例应用程序
本指南中使用的应用程序基于 Docker Compose 入门指南中的点击计数器应用程序。它由一个 Python 应用程序组成,该应用程序在 Redis 实例中维护一个计数器,并在您访问它时递增该计数器。
为项目创建一个目录:
$ mkdir stackdemo $ cd stackdemo
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)
创建一个名为的文件
requirements.txt
并将这两行粘贴到:flask redis
创建一个名为的文件
Dockerfile
并将其粘贴到:# syntax=docker/dockerfile:1 FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
创建一个名为的文件
compose.yml
并将其粘贴到:services: web: image: 127.0.0.1:5000/stackdemo build: . ports: - "8000:8000" redis: image: redis:alpine
Web 应用程序的映像是使用上面定义的 Dockerfile 构建的。它还标记有
127.0.0.1:5000
- 先前创建的注册表的地址。当将应用程序分发到集群时,这一点很重要。
使用 Compose 测试应用程序
使用 启动应用程序
docker compose up
。这将构建 Web 应用程序映像,拉取 Redis 映像(如果您还没有),并创建两个容器。您会看到有关引擎处于集群模式的警告。这是因为 Compose 没有利用集群模式,而是将所有内容部署到单个节点。您可以安全地忽略这一点。
$ 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
检查应用程序是否正在运行
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.
关闭应用程序:
$ 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
将生成的镜像推送到注册表
要在整个集群中分发 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
该堆栈现在已准备好部署。
将堆栈部署到 swarm
使用以下命令创建堆栈
docker stack deploy
:$ docker stack deploy --compose-file compose.yml stackdemo Ignoring unsupported options: build Creating network stackdemo_default Creating service stackdemo_web Creating service stackdemo_redis
最后一个参数是堆栈的名称。每个网络、卷和服务名称都以堆栈名称为前缀。
检查它是否正在运行
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
一旦运行,您应该会
1/1
在下面看到REPLICAS
这两个服务。如果您有多节点群,这可能需要一些时间,因为需要提取图像。和以前一样,您可以使用以下命令测试应用程序
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.
使用以下命令降低堆栈
docker stack rm
:$ docker stack rm stackdemo Removing service stackdemo_web Removing service stackdemo_redis Removing network stackdemo_default
使用以下命令关闭注册表
docker service rm
:$ docker service rm registry
如果您只是在本地计算机上进行测试并希望将 Docker 引擎退出 Swarm 模式,请使用
docker swarm leave
:$ docker swarm leave --force Node left the swarm.