如何在不将容器上载到注册表的情况下将Docker Compose堆栈推入Docker Swarm?

时间:2019-03-07 08:18:37

标签: docker docker-compose docker-swarm

在询问之前,我已经进行了研究,但所有答案都使我得出相同的结论:

  1. 在本地构建Docker Compose堆栈
  2. 标记图像并将其推送到注册表(如Docker Hub的私有或公共注册表)
  3. 使用docker stack deploy --compose-file docker-compose.yml stackdemo
  4. 将堆栈推入群集
  5. 从这里,堆栈从注册表中拾取并“拉出”图像并运行容器

没有直接的方法可以使以下(我认为是常识)场景无缝地工作吗?

  1. Docker集群管理器有权访问(SSH密钥)以从Git中提取项目。
  2. 它会定期使用docker-compose up拉动项目并“本地”构建项目
  3. 构建成功(容器已准备就绪)后,它将使用docker stack deploy将堆栈推入群集,将图像传播到所有工作节点。
  4. 通过这种方式,原始的“源代码”只有Manager节点才知道,并且只能直接访问Git存储库。

维护注册表(或为云平台付费)似乎是在Swarm模式下使用Docker的巨大缺点。

旁注:我已经尝试了deploying a registry as a service within the stack的方法,并标记+将图像推入127.0.0.1/myimage,但这导致了一系列自身的问题-例如没有运行“注册表”容器实例的工作程序节点无权提取映像(需要将注册表复制到所有节点)。

2 个答案:

答案 0 :(得分:1)

使用docker save和docker load命令将图像从开发机传输到所有集群机。

答案 1 :(得分:0)

Docker swarm 是编排的,用于或旨在管理 Docker 节点集群。当部署任何服务时,docker 引擎可以在集群中的任何节点(如果提供满足放置约束的节点)上启动它。现在,如果没有注册表,并且本地节点上有可用的图像,docker 无法验证是否所有节点都将指向同一版本的图像。因此,swarm 从注册中心拉取镜像,然后将其部署到节点。

即使在一个或所有 docker 节点上修剪图像,拥有注册表也有助于保留图像的副本,并且注册表会保留所有版本。可以启用注册表备份,因此不会丢失任何构建并推送到注册表的映像。

启动注册表(至少在本地主机上)非常容易 - 但这不是您的问题。

谈到您的问题,您可以将撰写堆栈文件保存在您拥有 Dockerfile 的同一目录中,然后在堆栈撰写文件中您可以编写将在部署堆栈时构建的服务:

version: "3.9"

services:
  web:
    image: 127.0.0.1:5000/stackdemo
    build: .
    ports:
      - "8000:8000"

这里,

build: .

此行将带有给定名称标记的映像构建到本地主机上的注册表 - 但不会推送,这需要手动完成。 因此,在 Dockerfile 中,您可以编写 git pull 或 git clone 然后运行命令来构建您的代码等。

这是一个链接,它提供了在部署堆栈时动态启动注册表和构建映像的简单步骤: https://docs.docker.com/engine/swarm/stack-deploy/

此外,swarm 在没有注册表的情况下无法工作,因此不可能只保存和加载图像并与 swarm 编排一起使用。