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

在Docker容器内运行Docker:无法连接到Docker守护程序,docker,ubuntu-16.04,Docker,Ubuntu 16.04,我创建了一个Docker文件以在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.doc

我创建了一个Docker文件以在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
启动容器并运行docker ps后,我得到: “无法连接到位于的Docker守护程序unix:///var/run/docker.sock. docker守护进程正在运行吗?”

我在容器中执行了dockerd命令,结果:

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


请建议

如果您真的想在其他Docker容器中运行Docker容器,您应该使用Docker()提供的现有图像,而不是创建自己的基础图像:选择标记为
dind
docker中的docker)或
-dind
(如
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

然而,我同意@DavidMaze的评论和他提到的参考博客帖子():应该尽可能避免Docker中的Docker。

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

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

您是如何启动容器的?使用特权模式?将主机的docker sock文件绑定到卷?是“不要这样做”。这是一个非常复杂的高级配置,几乎从来没有必要。首先,我使用docker构建创建了一个映像,然后我使用docker run-it myimageI运行了它。我需要以下两个参数才能工作(-v和--privileged),例如docker run-v/var/run/docker.sock:/var/run/docker.sock--privileged hello world