【问题标题】:Can docker run inside a Linux Container?docker 可以在 Linux 容器中运行吗?
【发布时间】:2014-03-31 21:27:39
【问题描述】:

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 的解决方法吗?

【问题讨论】:

    标签: linux docker lxc


    【解决方案1】:

    是的,这是可能的。但是,您不能在 aufs 中嵌套 aufs 分区。您需要挂载其他系统或使用不同的存储后端。

    您可以查看 docker 的 makefile 和 hack/dind。您需要特权模式才能这样做。

    最简单的尝试方法是make shell,一旦进入容器,你就可以启动一个新的 docker daemon :)

    编辑:我尝试了 Koding,但确实不可能。你在他们的容器中没有特权,所以你不能启动一个新的 docker。

    【讨论】:

      【解决方案2】:

      是的。见这篇博文:http://blog.docker.io/tag/inception/

      你必须以特权模式启动你的容器。

      docker run -privileged -t -i jpetazzo/dind
      

      【讨论】:

      • 你不能,因为 koding 已经在非特权容器中运行了。
      【解决方案3】:

      这里是同一条船上其他人的完整指南。

      启动终端并开始输入..

      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

      【讨论】:

      • 我认为原始发帖人询问在 LXC 中运行 Docker 而不是在 docker 中运行 docker。
      • 在我的例子中,服务名称是docker 而不是docker.io
      【解决方案4】:

      是的,docker 可以在 linux 容器中运行。

      但 docker 只能在 lxc 执行驱动程序和 unconfined 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 提供者,这个方法仍然很有趣,它回答了您遇到的更普遍的问题在您的问题标题中提出,这可能会在更一般的情况下吸引人们(就像我一样)。

      【讨论】:

        【解决方案5】:

        您可以在 Terminal.com 中执行此操作。

        只需启动一个终端,然后运行:https://blog.terminal.com/docker-without-containers-pulldocker/

        注意:我在 Terminal.com 工作。我们使用容器技术的非 LXC、非 libcontainer 实现(例如,它没有 AUFS 的限制)。我们正在尝试制造像完整的 Linux 机器一样运行的容器,我认为我们已经做到了。试试看。

        【讨论】:

          猜你喜欢
          • 2013-04-24
          • 1970-01-01
          • 2020-02-06
          • 1970-01-01
          • 2020-12-06
          • 2018-03-22
          • 2019-06-09
          • 1970-01-01
          相关资源
          最近更新 更多