使用 docker 堆栈部署和独立更新服务的 correct/better 方法是什么?
What is a correct/better way to use docker stack deploy with independently updated services?
我们有几个应用程序是一个更大的应用程序的一部分。
这些应用中的每一个都有一个基于每次提交的 Docker 图像。
我希望你使用 docker 集群模式,docker 自动堆叠到 deploy/update 这个更大的应用程序。
假设我有这个撰写文件(留下不相关的部分)
version: '3'
services:
product_service:
image: myregistry.com/product_service:c8372d
..
cart_service:
image: myregistry.com/cart_service:ee7f32
..
当我提交对购物车服务回购的更改时,我希望堆栈仅更新 cart_service
,但将 product_service
固定在其当前版本。此外,当产品服务更新时,我希望能够仅更新该服务,但将购物车服务保留在当前固定的版本。
在这种情况下我有什么选择?
我能想到的:
- 做一些花哨的事情并在提交时重新生成撰写文件,只更改我需要更改的部分
- 不要使用
docker stack deploy
而是使用旧的 docker service create
- 某种类型的环境变量传递到撰写文件中(这里的问题是每个服务仍然必须知道其他服务的当前版本,对吧?)
- 为每个服务使用不同的堆栈(这有什么问题吗?)
我是不是忽略了什么?这样的建筑不是故意的吗?这里有什么更好的方法?
我发现使用最后一个选项最简单,将每个服务拆分到自己的堆栈中,而不触及任何其他内容。然后提升单个服务的堆栈。为此,我要添加两个先决条件:
提前定义您的网络。然后在您的撰写中,将它们定义为外部以允许服务相互连接。这是将服务拆分为单独堆栈时损失的最大部分。
运行 您自己的注册表。对我来说,这比仅仅依赖固定版本更安全。 Pinning 将确保您在 swarm 中的所有节点上拉取相同的版本,但是如果您从开发升级到测试再到 prod,这些将是单独的堆栈,并且可能完全分开 swarm。对我来说,依赖 repo 中仅以受控方式更新的标签(CI/CD 脚本)要容易得多。
独立堆栈的优点是可以独立更新每项服务而不会破坏其他任何内容。但另一方面,缺点是当发生影响一切的变化时,您需要独立更新每项服务。这可能意味着您需要更多 scripting/automation 来管理环境。
我们有几个应用程序是一个更大的应用程序的一部分。
这些应用中的每一个都有一个基于每次提交的 Docker 图像。
我希望你使用 docker 集群模式,docker 自动堆叠到 deploy/update 这个更大的应用程序。
假设我有这个撰写文件(留下不相关的部分)
version: '3'
services:
product_service:
image: myregistry.com/product_service:c8372d
..
cart_service:
image: myregistry.com/cart_service:ee7f32
..
当我提交对购物车服务回购的更改时,我希望堆栈仅更新 cart_service
,但将 product_service
固定在其当前版本。此外,当产品服务更新时,我希望能够仅更新该服务,但将购物车服务保留在当前固定的版本。
在这种情况下我有什么选择?
我能想到的:
- 做一些花哨的事情并在提交时重新生成撰写文件,只更改我需要更改的部分
- 不要使用
docker stack deploy
而是使用旧的docker service create
- 某种类型的环境变量传递到撰写文件中(这里的问题是每个服务仍然必须知道其他服务的当前版本,对吧?)
- 为每个服务使用不同的堆栈(这有什么问题吗?)
我是不是忽略了什么?这样的建筑不是故意的吗?这里有什么更好的方法?
我发现使用最后一个选项最简单,将每个服务拆分到自己的堆栈中,而不触及任何其他内容。然后提升单个服务的堆栈。为此,我要添加两个先决条件:
提前定义您的网络。然后在您的撰写中,将它们定义为外部以允许服务相互连接。这是将服务拆分为单独堆栈时损失的最大部分。
运行 您自己的注册表。对我来说,这比仅仅依赖固定版本更安全。 Pinning 将确保您在 swarm 中的所有节点上拉取相同的版本,但是如果您从开发升级到测试再到 prod,这些将是单独的堆栈,并且可能完全分开 swarm。对我来说,依赖 repo 中仅以受控方式更新的标签(CI/CD 脚本)要容易得多。
独立堆栈的优点是可以独立更新每项服务而不会破坏其他任何内容。但另一方面,缺点是当发生影响一切的变化时,您需要独立更新每项服务。这可能意味着您需要更多 scripting/automation 来管理环境。