【问题标题】:Run docker inside a docker container?在 docker 容器中运行 docker?
【发布时间】:2014-10-07 15:02:21
【问题描述】:

我正在使用 docker 容器来构建我的软件并将其部署到 ec2 的集合中。在部署脚本中,我构建了我的软件,然后将其打包到 docker 映像中。图像被推送到我的私有注册表,由我的生产 ec2 拉取,然后运行。所以基本上我需要在 docker 容器中运行 docker。

问题是我实际上无法在我的容器上启动 docker。如果我尝试

service docker start

我明白了

bash: service: command not found

如果我尝试

docker -d

我明白了

2014/10/07 15:54:35 docker daemon: 0.11.1-dev 02d20af/0.11.1; execdriver: native; graphdriver:
[e2feb6f9] +job serveapi(unix:///var/run/docker.sock)
[e2feb6f9] +job initserver()
[e2feb6f9.initserver()] Creating server
2014/10/07 15:54:35 Listening for HTTP on unix (/var/run/docker.sock)
[error] attach_loopback.go:42 There are no more loopback device available.
loopback mounting failed
[e2feb6f9] -job initserver() = ERR (1)
2014/10/07 15:54:35 loopback mounting failed

docker 容器上不存在 service 命令,所以我无法启动 docker。我不确定我现在应该做什么来启动 docker,所以我有点卡在这里,感谢任何帮助。

更多信息

主机正在运行 fedora 20(最终将在 ec2 上运行 amazon linux)

Docker 容器正在运行 centos 7.0

主机运行 Docker 版本 1.2.0,构建 fa7b24f/1.2.0

容器正在运行 docker-0.11.1-22.el7.centos.x86_64

【问题讨论】:

  • 在容器中运行 centos/docker 0.11 有什么原因吗?如果它专门用于运行 Docker,你可以使用 CoreOS 或类似的东西。
  • centos 容器并不完全专用于运行 docker,它几乎所有的任务都与构建和测试软件有关。众所周知,我们所做的一切都可以在 centos 上成功运行,因此我们希望能够继续在容器中使用 centos。
  • 我认为“Docker 方式”仍然是启动一个单独的容器。容器非常适合运行单个应用程序。它们并不是要取代虚拟机更好地完成的任务。如果您有一个包含许多任务的复杂堆栈,则将其中一些任务分散到单独的容器中可能会有所帮助。此类任务的一个示例是运行其他 Docker 容器。
  • 遇到了同样的问题,我也是 CentOS 的爱好者。您是否找到任何解决方案或更好的方法来做到这一点??
  • CoreOS 591 遇到了同样的问题。有人找到解决方案了吗?

标签: centos docker fedora


【解决方案1】:

不运行“docker inside docker”并在您的主机上运行 docker,而是在您的 docker 容器中运行如何?只需挂载你的 docker.sock 和 docker 二进制文件:

docker run -v /var/run/docker.sock:/run/docker.sock -v $(which docker):/bin/docker [your image]

https://github.com/sameersbn/docker-gitlab 使用这种方法来启动 docker 容器,看看这张图片。

你也可以看看:https://registry.hub.docker.com/u/mattgruter/doubledocker/

2016 年 7 月更新

最新的方法是使用docker:dind 图像,如下所述: https://hub.docker.com/_/docker/

简短总结:

$ docker run --privileged --name some-docker -d docker:dind

然后: $ docker run --rm --link some-docker:docker docker info

【讨论】:

  • -v $(which docker):/bin/docker 技巧在我在 ubuntu 主机上运行基于 ubuntu 的图像时对我有用,但在 gentoo 主机上不起作用 - 所以我更喜欢安装 docker in容器并且只映射套接字文件
  • 一切都发生在您的主机上而不是在容器中时,在容器内安装 docker 套接字有什么意义。
  • 嗯,主要是因为它不是主机上发生的“一切”。以 docker-gitlab 镜像为例。
  • 使用绑定 sock 和可执行文件的方法在 OSX 上给我以下错误:docker: Error response from daemon: mkdir /usr/local/bin/docker: file exists.
  • 由于 docker-in-docker 方法的复杂性,作者建议绑定安装 docker 套接字(但不是 docker 二进制文件)的方法。见jpetazzo.github.io/2015/09/03/…
【解决方案2】:

虽然在几乎所有情况下,我都建议遵循@cthulhu 的回答并且在您必须运行“docker in docker”的情况下(例如,针对多个 docker 版本进行测试的测试套件),使用以下命令创建额外的环回设备:

#!/bin/bash

for i in {0..6}
do
    mknod -m0660 /dev/loop$i b 7 $i
done

(取自 Docker Issue #7058 的线程)

【讨论】:

    【解决方案3】:

    您可以使用dind 在 docker 容器内简单地运行 docker。试试 Jerome 的这张图片,如下所示:

    docker run --privileged -t -i jpetazzo/dind

    查看此页面了解更多详情:
    https://github.com/jpetazzo/dind

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多