2

我在不同的主机上使用 Docker:RHEL7、SELS12 和 CentOS7,与在 SLES12 或 RHEL7 作为 Docker 主机上运行的容器相比,我发现在 CentOS7 上作为 Docker 主机运行的容器中存在不同的行为。

不同的行为与 Docker 容器中的常见问题有关: https ://github.com/docker/docker/issues/7147
https://github.com/docker/docker/issues/6800

在 CentOS7 作为 Docker 主机的容器中:

有权解析路径中的符号:/proc/1
命令:ls -la /proc/1 在此处输入图像描述

容器的启动命令:

docker run -it --name=nessi_centos_test centos:latest bash

但在以 SLES12 或 RHEL7 作为 Docker 主机的容器中:

如您在上面的链接中所见,我使用相同的命令拒绝了许可。
命令:ls -la /proc/1 在此处输入图像描述

附加信息:

依赖于Docker 安全文档 ,容器默认以有限的 Linux 内核功能集开始。

其中一项功能是: CAP_SYS_PARCE
此功能默认存在于任何 Linux 主机

中: Linux 机器中的示例:
在此处输入图像描述

但是在所有容器中,默认情况下都缺少它(除非您使用 --cap-add=sys_ptrace 启动容器) 容器中的

示例: 在此处输入图像描述 您可以在此处看到容器具有一组受限制的功能,其中不包括 sys_ptrace 功能。

因此,如果我在 RHEL 或 SLES 中使用 --cap-add=sys_ptrace 作为 Docker 主机启动容器,我会得到与在 CentOS 7 中作为 Docker 主机相同的行为。

示例:Docker 主机:RHEL7
Docker 镜像:centos:latest(与之前相同)
Strat command: docker run -it --name=nessi_centos_test5 --cap-add=sys_ptrace centos:latest bash

在此处输入图像描述 在此处输入图像描述

正如您在此处看到的,为了获得与在 CentOS 7 中相同的行为,我需要使用额外的 sys_ptrace 功能启动我的容器。

技术信息:

  1. 不同的 CentOS 7 行为:在容器中运行命令:
    ls -la /proc/1
    结果:没有错误
  2. 其他主机(RHEL7 和 SLES12)的常规行为 在容器中运行命令:
    ls -la /proc/1
    结果:

ls: cannot read symbolic link /proc/1/cwd: Permission denied ls: cannot read symbolic link /proc/1/root: Permission denied ls: cannot read symbolic link /proc/1/exe: Permission denied

  1. 不同的 CentOS 7 行为再现于:

[root@localhost 桌面]# uname -a
Linux localhost.localdomain 3.10.0-327.22.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[root@localhost Desktop]# docker info
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 1.11.2
Storage Driver: devicemapper
Pool Name: docker-253:0-136686025-pool
Pool Blocksize: 65.54 kB
基本设备大小:10.74 GB
支持文件系统:xfs
数据文件:/dev/loop0
元数据文件:/dev/loop1
使用的数据空间:324.3 MB
数据空间总计:107.4 GB
可用数据空间:35.43 GB
使用的元数据空间:847.9 kB
元数据空间总量:2.147 GB
元数据可用空间:2.147 GB
Udev 同步支持:true
启用
延迟删除:false 启用延迟删除:false
延迟删除设备计数:0
数据循环文件:/var/lib/docker/devicemapper/devicemapper/data
警告:强烈建议不要将环回设备用于生产用途。
使用--storage-opt dm.thinpooldev或使用--storage-opt <br>dm.no_warn_on_loop_devices=true来抑制此警告。
元数据循环文件:/var/lib/docker/devicemapper/devicemapper/metadata
库版本:1.02.107-RHEL7 (2016-06-09)
日志驱动程序:json-file
Cgroup 驱动程序:cgroupfs
插件:
卷:本地
网络:空主机bridge
内核版本:3.10.0-327.22.2.el7.x86_64
操作系统:CentOS Linux 7 (Core)
OSType:linux
架构:x86_64
CPU:1
总内存:993.3 MiB
名称:localhost.localdomain
ID:BPVJ:YDPR:4VUO:WNBN:DVZH:7MEH:TPMP:Y3MP:GMN7:UT36:LQ74:GJ4N
Docker 根目录:/var/lib/ docker
调试模式(客户端):false
调试模式(服务器):false
注册表:https
://index.docker.io/v1/ 警告:bridge-nf-call-iptables 已禁用
警告:bridge-nf-call-ip6tables 已禁用禁用


Docker 镜像:
centos:latest
ubuntu:14.04

也在:
Docker daemon 版本:1.10.2




  1. 其他主机(RHEL7 和 SLES12) RHEL7 作为 Docker 主机的常规行为

    : [root@localhost ~]# uname -a
    Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux

    [root@localhost ~]# docker info
    Containers: 14
    Running: 6
    Paused: 0
    Stopped: 8
    Images: 22
    Server Version: 1.11.2
    Storage Driver: devicemapper
    Pool Name: docker-253:0 -67168288-pool
    池块大小:65.54 kB
    基本设备大小:10.74 GB
    支持文件系统:xfs
    数据文件:/dev/loop0
    元数据文件:/dev/loop1
    使用的数据空间:9.66 GB
    数据空间总计:107.4 GB
    可用数据空间:16.27 GB已
    使用元数据空间:7.68 MB
    元数据空间总计:2.147 GB
    可用元数据空间:2.14 GB
    支持 Udev 同步:true
    启用
    延迟删除:false 启用延迟删除:false
    延迟删除设备计数: 0
    数据循环文件:/var/lib/docker/devicemapper/devicemapper/data
    警告:强烈建议不要将环回设备用于生产用途。
    使用--storage-opt dm.thinpooldev或使用--storage-opt dm.no_warn_on_loop_devices=true来抑制此警告。
    元数据循环文件:/var/lib/docker/devicemapper/devicemapper/metadata
    库版本:1.02.107-RHEL7 (2015-12-01)
    日志驱动程序:json-file
    Cgroup 驱动程序:cgroupfs
    插件:
    卷:本地
    网络:空主机桥
    内核版本:3.10.0-123.el7.x86_64
    操作系统:Red Hat Enterprise Linux
    OSType:linux
    架构:x86_64
    CPU:2
    总内存:1.798 GiB
    名称:localhost .localdomain
    ID:VL2V:RUOZ:U55X:OCEQ:MAS6:MXYV:CKUY:WJQY:3KH3:LWPW:LUYH:E3MM
    Docker 根目录:/var/lib/docker
    调试模式(客户端):false
    调试模式(服务器): false
    注册表:https
    ://index.docker.io/v1/ 警告:bridge-nf-call-iptables 已禁用
    警告:bridge-nf-call-ip6tables 已禁用


    Docker 映像:
    centos:latest
    centos:7
    ubuntu:14.04
    ubuntu:latest
    rhel:latest
    suse/sles12:latest(在 SLES 机器上构建并复制到 RHEL 的映像)

    还在:
    Docker 守护程序版本:1.10.3 上进行了测试。1.9


    SLES12 作为 Docker 主机:

linux-ojix:~ # uname -a
Linux linux-ojix 3.12.28-4-default #1 SMP Thu Sep 25 17:02:34 UTC 2014 (9879bd4) x86_64 x86_64 x86_64 GNU/Linux

linux-ojix:~ # docker info
Containers: 6
Running: 3
Paused: 0
Stopped: 3
Images: 10
Server Version: 1.10.3

存储驱动程序:btrfs
构建版本:Btrfs v3.18.2+20150430
库版本:101
执行驱动程序:native-0.2
日志驱动程序:json-file
插件:
卷:本地
网络:bridge null host
内核版本:3.12.28-4-default
运行系统:SUSE Linux Enterprise Server 12
操作系统类型:linux
架构:x86_64
CPU:2
总内存:1.853 GiB
名称:linux-ojix
ID:NU4F:MOFR:RTUA:F2OM:4G67:NMGV:76S6:BONN:ASD5:XGHF:KVJQ: N242
警告:无交换限制支持


Docker 镜像:
centos:latest
centos:7
ubuntu:14.04
ubuntu:latest
suse/sles12:latest



有谁明白为什么 CentOS 作为 Docker 主机会导致不同的容器行为(容器中的 ls –la /proc/1 - 没有错误)与任何其他主机操作系统(容器中的 ls –la /proc/1 - 权限被拒绝错误)相比)?

4

1 回答 1

0

问题已解决,非常感谢:)

解决问题的步骤(与 RHEL 作为 docker 主机有关):
1. 我从 rhel-7-server-extras-rpms 安装了 Docker 版本:docker-1.10.3-44
2. 从 3.10.0 升级了我的内核- 229.el7.x86_64 到 kernel-3.10.0-327.18.2.el7.x86_64。
3. 重启我的机器,现在我可以解析容器内 /proc/1 下的符号链接了。

于 2016-07-12T09:43:04.457 回答