Docker:为什么/etc/resolv.conf不可读?中断DNS

Docker:为什么/etc/resolv.conf不可读?中断DNS,dns,docker,Dns,Docker,我在CentOS 7主机上使用Docker 1.6,使用CentOS 7容器。 在我的大多数容器中,DNS不起作用,因为无法读取/etc/resolv.conf,即使是根目录: [root@7ba55011e7ab etc]# ls -l /etc/resolv.conf ls: cannot access /etc/resolv.conf: Permission denied 这在我的大多数容器中都会发生,甚至是直接从标准Docker centos:最新图像创建的容器。(这个问题在我使用

我在CentOS 7主机上使用Docker 1.6,使用CentOS 7容器。 在我的大多数容器中,DNS不起作用,因为无法读取/etc/resolv.conf,即使是根目录:

[root@7ba55011e7ab etc]#  ls -l /etc/resolv.conf 
ls: cannot access /etc/resolv.conf: Permission denied
这在我的大多数容器中都会发生,甚至是直接从标准Docker centos:最新图像创建的容器。(这个问题在我使用标准Docker debian映像时也发生了。)resolv.conf唯一可读的容器是我从stock centos映像创建的第一个容器

不用说,我已经多次跳转Docker,并重新启动了主机。我还尝试在/etc/sysconfig/docker中的选项中使用--dns hostname。但这当然没有帮助,因为问题不在于resolv.conf的内容,而在于我无法阅读它(甚至作为root)

我知道/etc/resolv.conf是从主机的/etc/resolv.conf“绑定装载”的。此文件的主机副本看起来很好,权限也很合理:

[root@co7mars2 etc]# ls -l /etc/resolv.conf 
-rw-r--r--. 1 root root 106 Apr 30 18:08 /etc/resolv.conf
我无法从容器中装载/etc/resolv.conf:

umount -f -r /etc/resolv.conf 
umount: /etc/resolv.conf: must be superuser to umount
有解决办法吗

我在Docker github站点上看到了一些相关的问题,例如,但它们涉及复杂用例的增强,而不是我的情况,在我的情况下,我已经死在水里了

顺便说一句,我在两台独立且不相关的CentOS 7主机上进行了尝试,得到了相同的结果

谢谢。

要添加到,请提到您可以通过以下任何一种方式授予容器写访问权限(也就是说,至少具有读访问权限):

  • 为整个主机禁用SELinux:
    setEnforce0
见:

  • 将目录SELinux策略设置为允许任何容器访问:
  • 使容器
    --privileged

    这不仅会禁用SELinux约束,还会禁用默认cgroups约束:
  • 仅对此容器禁用SELinux策略约束:
  • 以SELinux进程类型
    unconfined\t
    运行容器进程:

docker主机上是否启用了SELinux?如果是这样,请尝试使用
setEnforce0
将其设置为允许模式进行测试,看看是否有帮助。就是这样!SELinux被设置为强制执行。将其设置为Permissive解决了问题。你是个天才。在我看来,docker中的
/etc/resolv.conf
没有绑定挂载,因为你可以修改它。我截断了它,它现在是空的,尽管主机一处于其原始状态。
# Example of proper behavior on fresh btrfs system when SELinux is in Permissive mode
[~]$ getenforce
Enforcing
[~]$ sudo setenforce 0
[~]$ getenforce
Permissive
[~]$ sudo docker run fedora echo "hello world"
hello world
[~]$ sudo setenforce 1
[~]$ sudo docker run fedora echo "hello world"
echo: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    chcon -Rt svirt_sandbox_file_t /var/db
    docker run --privileged -v /var/db:/data1 -i -t fedora
    docker run --security-opt label:disable -v /var/db:/data1 -i -t fedora
    docker run --security-opt label:type:unconfined_t -v /var/db:/data1 -i -t fedora