【问题标题】:How do I run Docker in Docker on Heroku?如何在 Heroku 上的 Docker 中运行 Docker?
【发布时间】:2019-07-22 14:32:19
【问题描述】:

为什么?
我正在尝试为在 Heroku 上运行 docker-compose 创建一个通用解决方案。我想通过使用 Heroku Button 部署来制作一键式部署解决方案。这样,用户不需要任何 git、Heroku cli 和 docker 知识。

问题。
仅当我将 stack 设置为 container 时,Docker 和 docker 守护程序才可用。有一些构建包可以为您提供 docker 和 docker-compose CLI,但如果没有 docker 守护程序,您将无法运行 docker 映像。所以 buildpacks 不起作用。
stack 设置为container,我可以使用文件heroku.yml (article)。在那里我定义了我的流程。 (它取代了Procfile。如果我仍然在我的项目中添加Procfile,它将什么都不做。)
我还可以在那里定义一个 Dockerfile 来构建我的 docker 映像。
但是,当我运行 docker 映像时,会弹出以下错误:

2019-02-28T15:32:48.462101+00:00 app[worker.1]: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
2019-02-28T15:32:48.462119+00:00 app[worker.1]: 
2019-02-28T15:32:48.462122+00:00 app[worker.1]: If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

问题在于 Docker 容器内部的 Docker 守护程序没有运行。解决方法是挂载它:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
而且由于您不能使用Procfile,因此我无法运行该命令。 (见上文heroku.yml 替换Procfile。)如果我使用的是buildpack,我可以使用Procfile,但docker 守护进程不会运行.....

我尝试在Dockerfile 中定义VOLUME,但问题仍然存在。此外,heroku 的一篇文章说"Volume mounting is not supported. The filesystem of the dyno is ephemeral."

在 Heroku 上可以运行 docker 镜像。我正在苦苦挣扎的是在 docker 映像中运行一个 docker。
通过挂载/var/run/docker.sock 在我的 VPS 上运行 docker 映像中的 docker 可以正常工作,但这不能(?)在 Heroku 上完成。

最后的话: 我试图让这项工作发挥作用,以便其他人可以轻松部署软件解决方案,即使他们对 git、heroku cli 和 docker 不满意。

【问题讨论】:

  • 一年过去了。我仍在寻找解决此问题的方法。
  • 您是否尝试通过 SSH 连接到您的守护进程?出于安全原因,我假设无法访问 Heroku 的 docker 守护进程,这就是您在挂载卷时在本地执行的操作。
  • 在 VPS 上我可以做得很好。在 Heroku 上我不能。 SSH 到 Heroku 堆栈应用程序有效,但 docker 守护程序没有按照描述中的说明运行。 SSH 到 docker 容器可能有效(没有尝试过),但我看不出如何从容器访问主机。此外,在运行堆栈应用程序时,它受到严重限制(root 不可用和许多其他限制)。我正在寻找一个运行自己的 Docker 守护程序的 Docker 容器。过去有针对它的工作,但它似乎已停止以支持绑定到主机的 docker 守护进程。
  • 这不是我所看到的:hub.docker.com/_/docker。我的意思是,当您在 heroku 上部署的容器内时,您确定守护程序没有运行吗?该错误告诉我您无法使用此地址连接到守护程序:http+docker://localhost。再说一次,如果启用,您可以使用 tcp://0.0.0.0:2375 或端口 2376 或自定义地址吗?将此作为参考:docs.docker.com/engine/reference/commandline/dockerd/…
  • 我也试过了,但没有出现同样的错误信息。我使用 env var DOCKER_HOST 指定了位置,并尝试了不同的 URL,包括您提到的 URL。我也试过/var/run/docker.sock。如果您能在 Heroku 上使用 DinD 创建一个最小的 hello world 示例,我将不胜感激。

标签: docker heroku docker-in-docker


【解决方案1】:

很遗憾,您的问题的答案是:还没有。

出于安全原因,Heroku 不向用户提供运行特权容器的能力,因为容器可以访问主机功能。 文档非常清楚您的limitations,例如:没有--priviledged 容器,也没有root 用户,没有VOLUMES,并且磁盘是临时的。

在玩过 DinD 镜像后,我得出的结论是,尝试在 Heroku 容器中运行 Docker 不是正确的选择和设计。 我很确定您要实现的目标与 Heroku 向用户提供的目标很接近。提供一个平台或应用程序,非开发人员只需一个按钮即可推送和部署应用程序,这可能会以各种方式非常有趣。它可以通过使用他们的平台 API 的应用程序来完成。 在这种情况下,Web 应用程序(在 Heroku 上运行)可能(据我所知)无法执行您想要的操作。相反,您需要嵌入桌面应用程序:git、docker 和您的应用程序,用于解析、验证、构建和推送您的应用程序/组件到 Heroku 的容器注册表。

最后,如果您仍然认为需要 DinD 解决方案,那么使用 VPS 的主要解决方案是目前唯一的解决方案。但请注意,它可能会为您的系统打开安全漏洞,并且在尝试限制这些安全门时,您可能会提供类似于 Heroku 的产品。

【讨论】:

  • 我将其标记为已接受的答案,因为到目前为止,我仍然不知道它怎么可能。如果有可能并且有人可以通过 Heroku Deploy 按钮提供一个具有最低 hello world 再现答案的新答案,我将授予 500 声望分数。
【解决方案2】:

我认为你不能在 Heroku 上运行可以使用 docker 命令启动一些 docker 容器的服务。

我想通过使用 Heroku Button 部署来制作一键式部署解决方案。

我认为您可以将部署按钮的引用更新到您的一些自动化服务器(例如:Jenkins 已经部署在 Heroku/另一个云上的实例)以触发部署管道并且不要让人们与 git/docker 交互等
但是,是的,您必须处理很多问题,例如安全性、参数。不使用 Jenkins/CircleCI 等流行解决方案登录然后部署时...

【讨论】:

【解决方案3】:

我所做的是将它安装在我的 dockerfile 中,如下所示:

RUN curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz \
  && tar xzvf docker-17.04.0-ce.tgz \
  && mv docker/docker /usr/local/bin \
  && rm -r docker docker-17.04.0-ce.tgz

然后在运行 docker 的 args 部分我添加了这个:

args '--user root -v /var/run/docker.sock:/var/run/docker.sock'

有关此功能为何有效的进一步说明,请参阅:stackoverflow.com/q/27879713/354577 不过这对我来说效果很好。

【讨论】:

  • 我在我的问题中解决了这个问题。无法在 Heroku 上挂载 /var/run/docker.sock
猜你喜欢
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2019-03-05
相关资源
最近更新 更多