如何在 Docker 容器中 运行 Docker 主机?
How to run a Docker host inside a Docker container?
我在 Docker 中有一个 Jenkins 容器 运行,我想在 运行 集成测试等时使用这个 Jenkins 容器来启动其他 Docker 容器
所以我的计划是在容器中安装 Docker 但这对我来说似乎不太奏效。我的 Docker 文件看起来像这样:
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
所以我的问题是:
- 如何在容器中实际启动 Docker 主机?或者是这个
应该避免的事情?
- 如果我是 运行 Mac 和 boot2docker,我需要做什么特别的事情吗?
- 也许我应该按照 here?
中所述将 link 改为主机上的 Docker
更新:我已经以 root 用户和 jenkins 身份尝试过容器。 sudo
未安装。
1.- 您启动的第一个容器(您在其中启动另一个容器的容器)必须是带有 --privileged=true
标志的 运行。
2.- 我觉得没有。
3.- 使用特权标志,您不需要将 docker 套接字作为卷安装。
检查 this project 以查看所有这些的示例。
一个更简单的替代方法是挂载 docker 套接字并创建同级容器。为此,请在您的图像上安装 docker 和 运行 类似的东西:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock myimage
在容器中,您现在应该能够像在主机上一样运行 docker 命令。此方法的优点是您不需要 --privileged
并可以使用主机的缓存。缺点是您可以看到所有 运行ning 容器,而不仅仅是从容器创建的容器。
我在 Docker 中有一个 Jenkins 容器 运行,我想在 运行 集成测试等时使用这个 Jenkins 容器来启动其他 Docker 容器
所以我的计划是在容器中安装 Docker 但这对我来说似乎不太奏效。我的 Docker 文件看起来像这样:
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
所以我的问题是:
- 如何在容器中实际启动 Docker 主机?或者是这个 应该避免的事情?
- 如果我是 运行 Mac 和 boot2docker,我需要做什么特别的事情吗?
- 也许我应该按照 here? 中所述将 link 改为主机上的 Docker
更新:我已经以 root 用户和 jenkins 身份尝试过容器。 sudo
未安装。
1.- 您启动的第一个容器(您在其中启动另一个容器的容器)必须是带有 --privileged=true
标志的 运行。
2.- 我觉得没有。
3.- 使用特权标志,您不需要将 docker 套接字作为卷安装。
检查 this project 以查看所有这些的示例。
一个更简单的替代方法是挂载 docker 套接字并创建同级容器。为此,请在您的图像上安装 docker 和 运行 类似的东西:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock myimage
在容器中,您现在应该能够像在主机上一样运行 docker 命令。此方法的优点是您不需要 --privileged
并可以使用主机的缓存。缺点是您可以看到所有 运行ning 容器,而不仅仅是从容器创建的容器。