如何从本地开发机器部署到 Docker Swarm?
How to deploy to a Docker Swarm from a local dev machine?
我已经在我的本地网络上设置了一个 Docker Swarm,其中包含两个 VM(1 位经理,1 位工作人员)。在管理器节点中,我创建了一个私有注册表服务,我想将本地开发机器(不在 swarm 中)中的一些本地构建的镜像部署到该注册表。 Swarm 文档和我在 Internet 上阅读的许多示例似乎都没有超出基础知识,运行管理器节点内的命令,构建、标记和推送图像从管理器的本地缓存到注册中心同样的节点,我有一种不安的感觉,好像我的脸上缺少了一些东西。
我看到我的机器可以简单地作为管理器加入 swarm,拥有注册表。其他节点会自动接收更新,我的问题就会消失。但这对于生产集群设置有意义吗,一个服务于生产代码的节点集群,取决于我开发人员的家用机器 - 即使是非工人,仅限经理?
我尝试过的事情:
- 将我的本地图像重新标记为
/my_app:1.0.0,然后是 docker-compose push
。我可以看到这确实将图像推送到管理器的注册表,但服务无法以消息“No such image: /my_app:1.0.0" 启动
- 创建上下文,并从我的机器 运行
docker-compose --context my_context up --no-start
。这(重新)在管理器节点的本地缓存中创建图像,然后我可以将其推送到注册表,但作为部署过程感觉非常笨重。
我是否应该 运行 管理器节点中的远程脚本到 git pull
我的代码,然后执行 build/push/docker 堆栈部署?
TL;DR 从 swarm 外部的本地开发机器将 image/app 部署到 Docker Swarm 的预期步骤是什么?这可能吗? Docker Swarm 支持吗?
在阅读了更多关于私有注册表和标签的内容后,我终于可以全神贯注于我的用例工作所需的标签。我的第一种方法只对了一半,但我不得不更改我的部署脚本以便:
- 从我的 docker-compose.yml 中提取
image
字段(格式为 localhost:5000/my_app:${MY_APP_VERSION-latest} ,以规避“没有这样的图像”错误)
- 创建用于推送到远程注册表的第二个标签,将“localhost”替换为我的管理器节点地址(注册表所在的位置)
- 用那个标签标记我本地构建的图像并
docker-compose push
它
- 使用
docker --context <staging|production> stack deploy my_app
部署应用
我正在回答自己,因为我确实解决了我原来的问题,但很想看到类似场景的其他 DevOps 实现。
我已经在我的本地网络上设置了一个 Docker Swarm,其中包含两个 VM(1 位经理,1 位工作人员)。在管理器节点中,我创建了一个私有注册表服务,我想将本地开发机器(不在 swarm 中)中的一些本地构建的镜像部署到该注册表。 Swarm 文档和我在 Internet 上阅读的许多示例似乎都没有超出基础知识,运行管理器节点内的命令,构建、标记和推送图像从管理器的本地缓存到注册中心同样的节点,我有一种不安的感觉,好像我的脸上缺少了一些东西。
我看到我的机器可以简单地作为管理器加入 swarm,拥有注册表。其他节点会自动接收更新,我的问题就会消失。但这对于生产集群设置有意义吗,一个服务于生产代码的节点集群,取决于我开发人员的家用机器 - 即使是非工人,仅限经理?
我尝试过的事情:
- 将我的本地图像重新标记为
/my_app:1.0.0,然后是 docker-compose push
。我可以看到这确实将图像推送到管理器的注册表,但服务无法以消息“No such image:/my_app:1.0.0" 启动
- 创建上下文,并从我的机器 运行
docker-compose --context my_context up --no-start
。这(重新)在管理器节点的本地缓存中创建图像,然后我可以将其推送到注册表,但作为部署过程感觉非常笨重。
我是否应该 运行 管理器节点中的远程脚本到 git pull
我的代码,然后执行 build/push/docker 堆栈部署?
TL;DR 从 swarm 外部的本地开发机器将 image/app 部署到 Docker Swarm 的预期步骤是什么?这可能吗? Docker Swarm 支持吗?
在阅读了更多关于私有注册表和标签的内容后,我终于可以全神贯注于我的用例工作所需的标签。我的第一种方法只对了一半,但我不得不更改我的部署脚本以便:
- 从我的 docker-compose.yml 中提取
image
字段(格式为 localhost:5000/my_app:${MY_APP_VERSION-latest} ,以规避“没有这样的图像”错误) - 创建用于推送到远程注册表的第二个标签,将“localhost”替换为我的管理器节点地址(注册表所在的位置)
- 用那个标签标记我本地构建的图像并
docker-compose push
它 - 使用
docker --context <staging|production> stack deploy my_app
部署应用
我正在回答自己,因为我确实解决了我原来的问题,但很想看到类似场景的其他 DevOps 实现。