【问题标题】:/var/run/docker.sock unaccessible in container running on centos 7/var/run/docker.sock 在 centos 7 上运行的容器中无法访问
【发布时间】:2015-03-16 23:55:37
【问题描述】:

我正在启动一个容器,该容器运行一个 bash 脚本,该脚本在 Centos 7.0.1406 上使用 docker 1.3.2 在内部进行 docker 构建。文件/命令位于https://gist.github.com/wrabbit-revisited/1d70d0f1805be1848c08

docker build 需要访问 docker 套接字,所以我使用了一个常用技巧,根据 http://nathanleclaire.com/blog/2014/07/12/10-docker-tips-and-tricks-that-will-make-you-sing-a-whale-song-of-joy/

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

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

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”,但没有明显变化。

这里有一些类似问题的参考:https://github.com/dpw/selinux-dockersock。它针对 Fedora/RHEL,但也没有解决这个问题。如果我使用“setenforce Permissive”和 sestatus 来确保 selinux 处于许可模式,则问题仍未解决。

我还尝试按照 https://github.com/jwilder/nginx-proxy/issues/40 将“--security-opt=label:type:docker_t”添加到 docker 命令行。没有明显效果。

这里描述了 Docker 的 selinux 策略:http://www.unix.com/man-page/centos/8/docker_selinux/

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

看了一下,可能和这个有关:https://github.com/docker/compose/issues/983。使用这个技巧在容器内运行 docker 是很常见的,但也许有更好的方法来做到这一点或一个好的解决方法。我考虑过,但这是可行的,这是一种在容器内运行 docker build 的广泛使用、简单(表面上)的方法。可能有一个简单的解决方案。

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

【问题讨论】:

  • 刚刚在 ubuntu 14.04 桌面上使用 docker 1.2.0 尝试过。在容器中运行的 build.sh 能够找到 /var/run/docker.sock 所以这个问题似乎是 Centos 7 特有的。顺便说一句,在构建 docker 映像之前必须使 build.sh 可执行。
  • 我们能够通过使用--privileged 标志让 DockerUI 在 RHEL/CentOS 上运行。这有点像大锤,我很高兴了解更好的方法。
  • 是的.. 目前 Docker 是一个移动的目标,尤其是在安全方面。目前对我来说不是一个障碍 - 我搬到了 Ubuntu 14.04 以避免这个问题。

标签: sockets docker selinux centos7


【解决方案1】:

我认为您的问题可能是由于对docker run-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 上,您还需要使用 https://github.com/dpw/selinux-dockersock 访问 /var/run/docker.sock 以在强制模式下使用 SELinux。

【讨论】:

  • 感谢您的意见,大卫。这个问题有一个错字 - 要点有实际的命令行,它确实使用了 docker.sock。
  • 感谢@David selinux-dockersock 是必不可少的!
【解决方案2】:

确认安装https://github.com/dpw/selinux-dockersock 从长远来看就足够了。

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

【讨论】:

  • 使用 CentOS 7 的人请注意。selinux-dockersock 不适用于 CentOS 7。在问题中,您将找到更新的模块。我花了一些时间才意识到这一点。
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2018-11-25
  • 2017-08-13
  • 1970-01-01
  • 2017-06-12
相关资源
最近更新 更多