【问题标题】:How to run a Docker host inside a Docker container?如何在 Docker 容器中运行 Docker 主机?
【发布时间】:2015-01-28 14:27:58
【问题描述】:

我有一个在 Docker 中运行的 Jenkins 容器,我想在运行集成测试等时使用这个 Jenkins 容器来启动其他 Docker 容器。

所以我的计划是在容器中安装 Docker,但这对我来说似乎效果不佳。我的 Dockerfile 看起来像这样:

FROM jenkins
MAINTAINER xxxx

# Switch user to root so that we can install apps
USER root

RUN apt-get update 

# Install latest version of Docker
RUN apt-get install -y apt-transport-https
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
RUN sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
RUN apt-get update
RUN apt-get install -y lxc-docker

# Switch user back to Jenkins
USER jenkins

jenkins 图像基于 Debian Jessie。当我根据生成的图像在容器内启动 bash 终端时,例如:

docker images

我收到以下错误消息:

FATA[0000] Get http:///var/run/docker.sock/v1.16/images/json: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

我怀疑这可能是因为 docker 服务没有启动。但是当我尝试启动服务时,我的下一个问题出现了:

service docker start

这给了我以下错误:

mount: permission denied

我已将/etc/init.d/docker 中的错误跟踪到这一行:

mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup

所以我的问题是:

  1. 如何在容器内实际启动 Docker 主机?或者这是 应该避免的事情?
  2. 如果我运行的是 Mac 和 boot2docker,有什么特别需要做的吗?
  3. 也许我应该按照here 的描述链接到主机上的 Docker?

更新:我已经以 root 和 jenkins 用户身份尝试过容器。 sudo 未安装。

【问题讨论】:

    标签: jenkins docker boot2docker


    【解决方案1】:

    更简单的替代方法是安装 docker 套接字并创建同级容器。为此,请在您的映像上安装 docker 并运行以下命令:

    docker run -it -v /var/run/docker.sock:/var/run/docker.sock myimage
    

    在容器中,您现在应该能够像在主机上一样运行 docker 命令。这种方法的优点是您不需要--privileged 并且可以使用来自主机的缓存。缺点是你可以看到所有正在运行的容器,而不仅仅是从容器中创建的那些。

    【讨论】:

    • 这在 ubuntu 上运行良好,但对于 debian:jessie 你将需要 libsqlite3-0 包 - 否则 ldd $(which docker) 显示 libsqlite3.so.0 => not found
    • 这在没有 /var/run/docker.sock 到 fwd 的 OSX 上如何工作?
    • @dgorissen Docker for Mac 启动一个小型 linux VM 来运行 Docker。这个虚拟机确实有 /var/run/docker.sock。
    • @AdrianMouat 谢谢,我实际上在 /private/var/run/docker.sock 中找到了套接字,假设是正确的
    • @AdrianMouat 经过一番摸索,结果证明你是对的,正确的路径是 /var/run/docker.sock 并且从 VM 内共享。我被主机上不存在但 /private/var/run/docker.sock 存在的事实所困扰。但是,后者不起作用。对于面临同样困惑的其他人,docker 文档中的这个页面终于帮助了我(命名空间部分):docs.docker.com/docker-for-mac/osxfs
    【解决方案2】:

    1.- 您启动的第一个容器(您在其中启动另一个容器的容器)必须使用 --privileged=true 标志运行。

    2.- 我认为没有。

    3.- 使用特权标志,您不需要将 docker 套接字安装为卷。

    查看this project 以查看所有这些示例。

    【讨论】:

    • 如果我以 root 身份运行 Jenkins 容器并且不在 Dockerfile 末尾包含“CMD [“wrapdocker”]”,则此方法有效。启动容器后,我需要手动运行“wrapdocker”。原因可能是 Jenkins 映像设置了一个 EntryPoint,如果我添加 CMD [“wrapdocker”],它似乎不起作用(容器不会启动)。因此,即使您已经回答了我的问题,它仍然无法按照我想要的方式工作,但我认为最好为这个问题创建另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2019-08-25
    • 1970-01-01
    • 2019-10-13
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多