在Docker容器内运行Docker?

30

我正在使用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容器中,服务命令不存在,因此我无法启动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或类似的操作系统。 - naneau
CentOS容器并不完全专注于运行Docker,几乎所有的任务都与软件构建和测试有关。我们所做的一切都已知在CentOS上成功运行,因此我们希望能够继续在容器中使用CentOS。 - Colin Murphy
1
我认为“Docker方式”仍然是启动一个单独的容器。容器非常适合运行单个应用程序,它们并不意味着要取代虚拟机执行更好的任务。如果您有一个包含多个任务的复杂堆栈,将其中一些任务分配到单独的容器中可能会有所帮助。这样的任务示例是运行其他Docker容器。 - naneau
遇到了相同的问题,我也是 CentOS 的爱好者。你找到了解决方案或更好的方法吗? - Adeel Ahmad
遇到了与CoreOS 591相同的问题。有人找到解决方案了吗? - sukrit007
3个回答

45
不如避免在docker中运行'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

1
-v $(which docker):/bin/docker 这个技巧在我使用基于Ubuntu主机的镜像时很有效,但在Gentoo主机上无效 - 所以我更喜欢在容器中安装docker,并仅映射套接字文件。 - ISanych
1
将Docker套接字挂载到容器内部有什么意义,当一切都发生在主机上而不是容器内部时。 - Tomas Tomecek
主要是因为不是所有的事情都发生在主机上。以docker-gitlab镜像为例。 - cthulhu
使用将套接字和可执行文件绑定的方法在OSX上出现以下错误: docker: Error response from daemon: mkdir /usr/local/bin/docker: file exists. - Phillipp
dind作者建议使用绑定挂载docker套接字(但不是docker二进制文件)的方法,因为在使用docker-in-docker方法时会出现复杂性。请参阅https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/。 - Mike McCabe

3

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

#!/bin/bash

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

(摘自Docker问题#7058的讨论串)


2

您可以使用dind在Docker容器内部运行Docker。 可以尝试来自Jerome的此镜像,如下所示:

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

有关更多详细信息,请查看此页面:
https://github.com/jpetazzo/dind


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接