与任何其他主机操作系统相比,CentOS 作为 Docker 主机会导致不同的容器行为

Posted

技术标签:

【中文标题】与任何其他主机操作系统相比,CentOS 作为 Docker 主机会导致不同的容器行为【英文标题】:CentOS as a Docker host causes different container behavior compared to any other host OS 【发布时间】:2016-11-09 17:18:24 【问题描述】:

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

不同的行为与 Docker 容器中的常见问题有关: https://github.com/docker/docker/issues/7147https://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 security documentation 的容器默认以一组受限的 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 功能启动我的容器。

技术资料:

    不同的 CentOS 7 行为:在容器中运行命令:ls -la /proc/1 结果:没有错误 其他主机(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

    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 桌面]# 泊坞窗信息 容器:1 正在运行:0 暂停:0 停止:1 图片:1 服务器版本:1.11.2 存储驱动程序:devicemapper 池名称:docker-253:0-136686025-pool 池块大小: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 插件: 音量:本地 网络:空主机桥 内核版本:3.10.0-327.22.2.el7.x86_64 操作系统:CentOS Linux 7(核心) 操作系统类型:linux 架构:x86_64 CPU:1 总内存:993.3 MiB 名称:localhost.localdomain 编号: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:最新 ubuntu:14.04也在: Docker 守护进程版本:1.10.2

    其他主机(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 ~]# 码头工人信息 容器:14 跑步:6 暂停:0 停止:8 图片:22 服务器版本:1.11.2 存储驱动程序:devicemapper 池名称: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 操作系统:红帽企业 Linux 操作系统类型:linux 架构:x86_64 CPU:2 总内存:1.798 GiB 名称:localhost.localdomain 编号: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:最新 centos:7 ubuntu:14.04 ubuntu:最新 rhel:最新 suse/sles12:latest(在 SLES 机器上构建并复制到 RHEL 的映像)也在: Docker 守护程序版本:1.10.3。 1.9SLES12 作为 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:~ # 码头工人信息 容器:6 正在运行:3 暂停:0 停止:3 图片:10 服务器版本:1.10.3

存储驱动程序:btrfs 构建版本:Btrfs v3.18.2+20150430 库版本:101 执行驱动程序:native-0.2 日志记录驱动程序:json-file 插件: 音量:本地 网络:网桥空主机 内核版本:3.12.28-4-default 操作系统:SUSE Linux Enterprise Server 12 操作系统类型:linux 架构:x86_64 CPU:2 总内存:1.853 GiB 名称:linux-ojix 编号:NU4F:MOFR:RTUA:F2OM:4G67:NMGV:76S6:BONN:ASD5:XGHF:KVJQ:N242 警告:不支持交换限制Docker 映像: centos:最新 centos:7 ubuntu:14.04 ubuntu:最新 suse/sles12:latest 有谁明白为什么 CentOS 作为 Docker 主机会导致不同的容器行为(容器中的 ls –la /proc/1 - 没有错误)与任何其他主机操作系统(容器中的 ls –la /proc/1 - 出现权限被拒绝错误)?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于与任何其他主机操作系统相比,CentOS 作为 Docker 主机会导致不同的容器行为的主要内容,如果未能解决你的问题,请参考以下文章

Centos8 Yum安装nginx并设置虚拟主机

centos7下安装docker(15.7容器跨主机网络---calico)

Yum安装nginx并设置虚拟主机_Centos8

centos永久修改主机名以及etc/hosts文件详解

main() 函数与 C 中的其他函数相比如何?

Vmware安装Centos系统与主机互相Ping通的问题