Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets /var/run/docker.sock在centos 7上运行的容器中不可访问_Sockets_Docker_Selinux_Centos7 - Fatal编程技术网

Sockets /var/run/docker.sock在centos 7上运行的容器中不可访问

Sockets /var/run/docker.sock在centos 7上运行的容器中不可访问,sockets,docker,selinux,centos7,Sockets,Docker,Selinux,Centos7,我正在启动一个运行bash脚本的容器,该脚本在Centos 7.0.1406上使用docker 1.3.2在内部构建docker。文件/命令位于 docker构建需要访问docker套接字,因此我使用了一个常见技巧,如下所示: 在构建之前,我在脚本中运行一个检查: if [ -e "/var/run/docker.sock" ]; then echo "docker.sock found" else echo "docker.sock not found" fi “echo”显示未找到

我正在启动一个运行bash脚本的容器,该脚本在Centos 7.0.1406上使用docker 1.3.2在内部构建docker。文件/命令位于

docker构建需要访问docker套接字,因此我使用了一个常见技巧,如下所示:

在构建之前,我在脚本中运行一个检查:

if [ -e "/var/run/docker.sock" ];
then
  echo "docker.sock found"
else
  echo "docker.sock not found"
fi
“echo”显示未找到docker.sock。如果使用sudo在容器外部进行检查,则会发现此问题

我尝试在“docker run”命令行中添加“-permissive=true”,但没有明显的变化

这里有一些类似问题的参考:。它的目标是Fedora/RHEL,但也不能解决这个问题。如果我使用“setenforce Permissive”和sestatus来确保selinux处于许可模式,那么问题仍然没有解决

我还尝试在docker命令行中添加“-security opt=label:type:docker\u t”,如所示。没有明显的效果

Docker的selinux策略如下所述:

有很多信息,但我不确定selinux是否导致了这个问题。如果我编辑/etc/selinux/config以禁用selinux,然后重新启动并运行sestatus,则会显示selinux已禁用,但问题仍然存在

环顾四周,可能与此有关:。使用这个技巧在容器中运行docker是很常见的,但也许有更好的方法或者一个好的解决方法。我考虑过dind,但这是一个工作,这是一个广泛使用的、简单(表面上)的方法,可以在容器中运行docker构建。可能有一个简单的解决方案

任何帮助都将不胜感激!
谢谢

我认为您的问题可能是由于对
-v
选项的误解导致的。你说是的

-v /var/run/docker:/var/run/docker
这将在容器中为文件或目录创建绑定装载
/var/run/docker
。但在您的情况下,没有这样的文件或目录。您需要文件
/var/run/docker.sock
。所以你需要这样做

-v /var/run/docker.sock:/var/run/docker.sock
要绑定,请将该文件装载到容器中

由于
/var/run/docker
不存在,您可能想知道docker为什么不告诉您错误。但是
-v
选项有一个令人惊讶的行为,即如果该路径在主机上不存在,docker会将其创建为目录。因此,在主机和容器上会出现一个无用的空
/var/run/docker
目录

原则上,您也可以执行
-v/var/run:/var/run
绑定装载包含的目录。但是,让容器访问主机的
/var/run
目录树可能不是一个好主意

当您在CentOS上时,您还需要使用访问/var/run/docker.sock的权限,以便在强制模式下与SELinux一起工作。

确认从长远来看,安装已足够且良好


另一个快速的解决方法是在启动容器时传递
--privileged
参数。

刚刚在Ubuntu14.04桌面和docker 1.2.0上试用过。容器中运行的build.sh能够找到/var/run/docker.sock,因此这个问题似乎与Centos 7有关。顺便说一句,在构建docker映像之前,有必要使build.sh可执行。我们可以使用
--privileged
标志让DockerUI在RHEL/CentOS上工作。这有点像一把大锤,我很高兴能学到更好的方法。是的。。目前Docker是一个移动目标,尤其是wrt安全。我现在不是一个拦截器-我移动到Ubuntu 14.04以避免这个问题。谢谢你的输入,大卫。这个问题有一个输入错误-要点有实际的命令行,它确实使用docker.sock.Thank@David selinux dockersock是必不可少的!对于使用CentOS 7的用户,请注意。selinux dockersock不适用于CentOS 7。在问题中,您将发现更新的模块。我花了一些时间才意识到这一点。
-v /var/run/docker.sock:/var/run/docker.sock