Docker可以在Linux容器内运行吗?

14

Koding 是一个协作编程环境,可以创建虚拟机供多个用户共同开发软件。他们使用 Linux 容器对计算机进行虚拟化。但是我无法在其上安装 Docker:

tiagoboldt@vm-2:~$ sudo docker build -t mongo .       
[sudo] password for tiagoboldt:          
Uploading context 645.1 kB
Uploading context 
Step 0 : FROM ubuntu:latest                                                                                                                                                                                      
Pulling repository ubuntu                                                                                                                                                                                        
9cd978db300e: Error pulling image (latest) from ubuntu, endpoint: https://cdn-registry-1.docker.io/v1/, Driver aufs failed to get image rootfs 6170bb7b0ad1003a827e4dc5253ba49f6719599eac485db51eaafd507c13c311: 
9cd978db300e: Error pulling image (latest) from ubuntu, Driver aufs failed to get image rootfs 6170bb7b0ad1003a827e4dc5253ba49f6719599eac485db51eaafd507c13c311: permission denied                               
6170bb7b0ad1: Error downloading dependent layers                                                                                                                                                                 

2014/02/28 03:32:55 build: pull: Could not find repository on any of the indexed registries.

有人能提供安装Docker的解决方案吗?
5个回答

23

是的,Docker可以在Linux容器中运行。

但是,要让Docker在LXC中运行,需要使用lxc执行驱动程序并在一个未限制的LXC中运行。

下面是如何在LXC中获得Docker的步骤:

  1. 确保您的LXC的config文件中有lxc.aa_profile = lxc-container-default-with-nesting(如果不起作用或没有此配置文件,则尝试lxc.aa_profile = unconfined),以确保它不会被apparmor阻止。有关更多信息,请访问(或修改)位于/etc/apparmor.d/lxc中的文件。

  2. 您需要在容器中安装LXC。例如,如果您在Ubuntu上运行,请在容器中运行apt-get install lxc

  3. 确保使用--exec-driver=lxc参数调用Docker守护程序。您可以先手动发出docker -d --exec-driver=lxc命令进行测试。在Ubuntu上,为了让参数在启动时被使用,只需编辑/etc/default/docker并确保您有以下行:

DOCKER_OPTS="--exec-driver=lxc"

关注此帖获取更新: https://github.com/docker/docker/issues/6783

如果您需要进行故障排除:

  • 注意主机的apparmor日志记录。
  • 手动启动docker -d ...以获取输出。

注意:您可能没有权限修改Koding上LXC apparmor脚本的主机,但是如果您是LXC提供者,则仍然可以从中受益,并回答了您在问题标题中提出的更一般的问题,这可能会吸引更多一般情况下(如我)的人。


6
是的,这是可能的。但是,你不能在aufs分区中嵌套另一个aufs分区。你需要挂载其他系统或使用不同的存储后端。
你可以查看docker的makefile和hack/dind。你需要特权模式才能这样做。
最简单的方法是执行"make shell",然后在容器中启动新的docker守护进程:)
编辑:我尝试了Koding,确实不可能。你在他们的容器内没有特权,所以无法启动新的docker。

5

这里为有同样需求的用户提供完整指南。

打开终端并开始输入以下内容:

docker run -i -t --privileged -v /var/lib/docker ubuntu bash
apt-get update && apt-get install -y docker.io
service docker.io start
ln -s /usr/bin/docker.io /usr/local/bin/docker
docker run -i -t ubuntu bash

现在你应该在另一个容器中的容器内部。
备注:
  1. 外部容器需要使用标志--privileged才能实现这一点。
  2. 必须使用-v /var/lib/docker来避免creack提到的限制。
  3. ln -s /usr/bin/docker.io /usr/local/bin/docker只是创建了一个符号链接,这样我们可以键入docker而不是docker.io

9
我认为原帖的作者询问如何在 LXC 中运行 Docker 而不是在 Docker 中运行 Docker。 - dtoux
在我的情况下,服务名称是docker而不是docker.io - Mahdi

1

你无法这样做,因为Koding已经在一个非特权容器中运行。 - tiagoboldt

1
你可以在Terminal.com内完成此操作。
只需启动终端,然后运行以下命令:https://blog.terminal.com/docker-without-containers-pulldocker/
注意:我在Terminal.com工作。我们使用一种非LXC、非libcontainer实现的容器技术(它没有AUFS的限制,例如)。我们正在努力创建表现像完整Linux机器的容器,我认为我们已经做到了。试试吧。

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