【问题标题】:How to deploy to a Docker Swarm from a local dev machine?如何从本地开发机器部署到 Docker Swarm?
【发布时间】:2021-03-26 02:22:40
【问题描述】:

我在本地网络上设置了一个由两个虚拟机组成的 Docker Swarm(1 个经理,1 个工作人员)。在管理器节点中,我创建了一个私有注册表服务,并且我想在我的本地开发机器(不在集群中)中部署一些本地构建的图像到该注册表。 Swarm 文档和我在互联网上阅读的数十个示例似乎并没有超出基础,在管理器节点内运行命令,构建、标记和推送管理器本地缓存中的图像到同一节点中的注册表,以及我有一种不安的感觉,我的脸上缺少了一些东西。

我发现我的机器可以简单地以管理员身份加入 swarm,拥有注册表。其他节点会自动接收更新,我的问题就会消失。但这对于生产群设置是否有意义,即服务生产代码的节点集群,取决于我的开发人员的家用机器 - 即使作为非工作人员,仅限管理人员?

我尝试过的事情:

  • 将我的本地图像重新标记为 /my_app:1.0.0,然后是 docker-compose push。我可以看到这确实将图像推送到管理器的注册表,但服务无法启动消息“没有这样的图像:/my_app:1.0.0”
  • 创建一个上下文,然后在我的机器上运行docker-compose --context my_context up --no-start。这(重新)在管理器节点的本地缓存中创建图像,然后我可以将其推送到注册表,但作为部署过程感觉非常笨拙。

我是否应该在管理器节点中运行远程脚本到git pull 我的代码,然后进行构建/推送/docker 堆栈部署?

TL;DR 从 swarm 外部的本地开发机器将图像/应用程序部署到 Docker Swarm 的预期步骤是什么?这可能吗? Docker Swarm 支持吗?

【问题讨论】:

  • 您无需以管理员身份加入您的开发机器即可推送到本地 docker 注册表,只要您使用注册表凭据,以工作人员身份加入即可。现在,如果您希望拥有一个适当的“devops”环境,您的注册表实际上应该是第三台专用机器,具有适当的主机名和可见性(LAN 或 WAN)并且在 swarm 之外。不过,您的问题有点过于宽泛,并且很大程度上取决于您的用例的其他细节。
  • 但是作为worker加入,我的机器不会成为接受经理任务的目标吗?当然,我可以通过标签/约束来防止这种情况,但是仅仅为了部署而增加的复杂性对我来说有点奇怪。我会在 swarm 之外的注册表上查找。谢谢!

标签: docker docker-swarm infrastructure


【解决方案1】:

在阅读了有关私有注册表和标签的更多内容后,我终于可以围绕必要的标签进行思考,以使我的用例能够正常工作。我的第一种方法是正确的,但我必须更改我的部署脚本以便:

  1. 从我的 docker-compose.yml 中提取 image 字段(格式为 localhost:5000/my_app:${MY_APP_VERSION-latest},以规避“没有这样的图像”错误)
  2. 创建第二个标签用于推送到远程注册表,将“localhost”替换为我的管理器节点地址(注册表所在的位置)
  3. 用该标签和docker-compose push它标记我本地构建的图像
  4. 使用docker --context <staging|production> stack deploy my_app 部署应用程序

我在回答自己,因为我确实解决了我最初的问题,但很想看到类似场景的其他 DevOps 实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多