在 Docker 容器内运行 Docker:无法连接到 Docker 守护进程

Ami*_*mir 4 docker ubuntu-16.04

我创建了一个 Dockerfile 来在 Docker 中运行 Docker:

    FROM ubuntu:16.04
RUN apt-get update && \
    apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - &&\
    apt-key fingerprint 0EBFCD88

RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
   apt-get update && \
   apt-get install -y docker-ce && \
   systemctl enable docker
Run Code Online (Sandbox Code Playgroud)

在我启动容器并运行 docker ps 后,我得到:“无法连接到 unix:///var/run/docker.sock 上的 Docker 守护进程。docker 守护进程是否正在运行?”

我在容器内执行命令 dockerd 结果:

启动守护程序时出错:初始化网络控制器时出错:获取控制器实例时出错:无法创建 NAT 链 DOCKER:iptables 失败:iptables -t nat -N DOCKER:iptables v1.6.0:无法初始化 iptables 表 `nat':权限被拒绝(您必须是 root 用户)也许需要升级 iptables 或您的内核。(退出状态 3)

请指教

小智 8

我收到的建议是在 docker run 中使用 -v 参数来映射容器之间的 docker 套接字,如下所示:

-v /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)


nor*_*bjd 7

如果您确实想在其他 Docker 容器中运行 Docker 容器,则应该使用 Docker ( https://hub.docker.com/_/docker ) 提供的现有映像,而不是创建自己的基础映像:选择标记的映像as dind( docker in docker ) 或(<docker_version>-dind like 18.09.0-dind)。如果您想运行自己的映像(但不推荐),请不要忘记使用选项运行它--privileged(这就是您收到错误的原因)。

官方图片示例docker

# run Docker container running Docker daemon
docker run --privileged --name some-docker -d docker:18.09.0-dind

# run hello-world Docker image inside the Docker container previously started
docker exec -i -t some-docker docker run hello-world
Run Code Online (Sandbox Code Playgroud)

尽管如此,我同意@DavidMaze 的评论和他提到的参考博客文章(Do not use Docker-in-Docker for CI):应该尽可能避免使用 Docker-in-Docker。

  • 我需要以下两个参数才能使其工作(-v 和 --privileged),例如 docker run -v /var/run/docker.sock:/var/run/docker.sock --privileged hello-world (2认同)