将堆栈部署到 swarm
在 swarm 模式下运行 Docker Engine 时,您可以使用docker stack deploy
自
将完整的应用程序堆栈部署到 Swarm。这deploy
command 接受
Compose 文件形式的堆栈描述。
注意
这
docker stack deploy
命令使用 Compose V1 使用的传统 Compose 文件版本 3 格式。由 Compose 规范定义的最新格式与docker stack deploy
命令。如需详细了解 Compose 的演变,请参阅 Compose 的历史。
要运行本教程,您需要:
在 Swarm 模式下运行的 Docker 引擎。 如果您不熟悉 Swarm 模式,则可能需要阅读 Swarm 模式关键概念和服务的工作原理。
注意
如果你在本地开发环境中尝试,那么 您可以将引擎置于 Swarm 模式
docker swarm init
.如果您已经运行了一个多节点 swarm,请记住,所有
docker stack
和docker service
命令必须从 Manager 运行 节点。Docker Compose 的当前版本。
设置 Docker 注册表
由于一个 swarm 由多个 Docker 引擎组成,因此需要一个注册表来 将镜像分发给所有这些用户。您可以使用 Docker Hub 或维护自己的 Docker Hub。以下是创建方法 一个一次性注册表,之后可以丢弃它。
在您的 swarm 上将注册表作为服务启动:
$ 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 应用程序的 Python 应用程序,它在 Redis 实例中维护一个计数器,并递增 counter 每次访问它时。
为项目创建一个目录:
$ 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 测试应用
使用 启动 App
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
检查应用程序是否正在运行
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
将生成的镜像推送到注册表
要在 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
堆栈现在可以部署了。
将堆栈部署到 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
最后一个参数是堆栈的名称。每个网络、卷和服务 name 以堆栈名称为前缀。
检查它是否与
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
对于这两种服务。 如果您有多节点 swarm,这可能需要一些时间,因为镜像需要 被拉动。和以前一样,您可以使用
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 Engine 脱离 Swarm 模式,请使用
docker swarm leave
:$ docker swarm leave --force Node left the swarm.