容器安全拾遗 - Rootless Container初探

本文介绍了Docker 19.03引入的Rootless Container特性,该特性允许非特权用户运行Docker,提高了安全性。文章详细阐述了Rootless容器的背景、架构,包括user namespaces和SLiRP网络方案,并提供了环境准备与验证步骤。虽然Rootless容器在网络和存储性能上还有优化空间,但其在提升容器安全隔离性和适用场景方面迈出了一步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期Docker 19.03中发布了一个重要的特性 “Rootless Container支持”。趁着五一假期,快速验证一下。本文参考了Experimenting with Rootless Docker 一文的内容,并且补充了更多的细节和上手内容。

Rootless容器背景与架构

Docker和Kubernetes已经成为企业IT架构的基础设施,其自身安全越来越被关注。Docker基于Linux操作系统提供了应用虚拟化能力,通过namespace, cgroup实现了资源的隔离和配额约束。Docker Engine是一个典型的 Client-Server 结构:

Docker Client (TCP/Unix Socket) -> Docker Daemon (Parent/Child Processes) -> Container

由于Linux需要特权用户来创建namespace,挂载分层文件系统等,所以 Docker Daemon 一直以来是以root用户来运行的。这也导致了有Docker访问权限的用户可以通过连接Docker Engine获取root权限,而且可以绕开系统的审计能力对系统进行攻击。这阻碍了容器在某些场景的应用:比如在高性能计算领域,由于传统的资源管理和调度系统需要非特权用户来运行容器,社区实现了另外的容器运行时Singularity 。

Moby社区的 Akihiro Suda,为Docker Engine和Buildkit贡献了rootless容器支持,让Docker Engine以非特权用户方式运行,更好地复用Linux的安全体系。

注意:

  1. 目前rootless容器还在实验阶段,cgroups 资源控制, apparmor安全配置, checkpoint/restore等能力还不支持。
  2. 目前只有Ubuntu提供了在rootless模式下对overlay fs的支持,由于安全顾虑,这个方案尚未得到upstream的支持。其他操作系统需要利用VFS存储驱动,有一定性能影响,并不适合I/O密集型应用。

Rootless容器有几个核心技术

首先是利用 user namespaces 将容器中的root用户uid/gid映射到宿主机的非特权用户范围内。Docker Engine已经提供了 --userns-remap 标志支持了相关能力,提升了容器

Error: Problem: package docker-ce-3:26.1.3-1.el7.aarch64 requires docker-ce-rootless-extras, but none of the providers can be installed - conflicting requests - nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.0-3.el7.aarch64 - nothing provides slirp4netns >= 0.4 needed by docker-ce-rootless-extras-20.10.0-3.el7.aarch64 - nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.1-3.el7.aarch64 - nothing provides slirp4netns >= 0.4 needed by docker-ce-rootless-extras-20.10.1-3.el7.aarch64 - nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.10-3.el7.aarch64 - nothing provides slirp4netns >= 0.4 needed by docker-ce-rootless-extras-20.10.10-3.el7.aarch64 - nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.11-3.el7.aarch64 - nothing provides slirp4netns >= 0.4 needed by docker-ce-rootless-extras-20.10.11-3.el7.aarch64 - nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.12-3.el7.aarch64 - nothing provides slirp4netns >= 0.4 needed by docker-ce-rootless-extras-20.10.12-3.el7.aarch64 - nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.13-3.el7.aarch64 - nothing provides slirp4netns >= 0.4 needed by docker-ce-rootless-extras-20.10.13-3.el7.aarch64 - nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.14-3.el7.aarch64 - nothing provides slirp4netns >= 0.4 needed by docker-ce-rootless-extras-20.10.14-3.el7.aarch64 - nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.15-3.el7.aarch64
04-02
<think>好的,我现在需要帮助用户解决在安装Docker CE时遇到的依赖问题,缺少fuse-overlayfs和slirp4netns这两个包,系统是EL7的aarch64架构。首先,我得回想一下Docker安装的一般步骤,以及常见的依赖问题。 根据用户提供的引用内容,安装Docker通常需要设置仓库,然后安装docker-ce和相关组件。用户提到他们遇到了缺少依赖的问题,特别是fuse-overlayfs和slirp4netns。这两个包是容器存储和网络所需的,可能在较新的Docker版本中需要,而默认的仓库里可能没有这些包。 首先,我应该检查这些依赖是否在官方仓库中存在。EL7通常指的是CentOS 7或RHEL 7,但用户使用的是aarch64架构,这可能导致某些包不可用。可能需要添加额外的仓库,比如EPEL(Extra Packages for Enterprise Linux),因为EPEL通常包含更多的软件包。 根据引用[3],用户已经执行了安装必要工具和设置仓库的步骤,但可能没有启用EPEL。所以第一步应该是安装EPEL仓库。安装EPEL后,再次尝试安装依赖包,可能就能找到所需的fuse-overlayfs和slirp4netns。 如果EPEL中没有这些包,可能需要寻找其他第三方仓库,比如Docker自己的测试仓库或者社区维护的仓库。另外,用户也可以尝试手动下载这些依赖的RPM包进行安装,但需要注意版本兼容性和架构是否正确(aarch64)。 此外,用户提到使用的是EL7,而Docker的某些版本可能不再支持EL7,或者需要特定的配置。可能需要调整Docker版本,安装稍旧的稳定版本,这些版本可能依赖较旧的包,从而避免缺少最新依赖的问题。例如,用户引用的[1]中提到了docker-ce-20.10.7-3.el7.x86_64.rpm,但用户系统是aarch64,可能需要对应架构的包。 另外,用户可能没有安装containerd.io,这也是Docker的一个依赖项,需要确认是否已正确安装。引用[2]提到卸载时需要移除docker-ce、docker-ce-cli和containerd.io,说明containerd.io是必要组件。 总结可能的解决步骤: 1. 安装EPEL仓库,以获取更多软件包。 2. 使用yum-utils中的yum-config-manager启用额外的仓库,比如docker-ce-test。 3. 清理旧的Docker安装,确保没有残留。 4. 尝试安装特定版本的Docker CE,可能旧版本依赖较少。 5. 手动下载安装缺少的依赖包。 同时,需要注意用户系统的架构是aarch64,所有步骤中的包必须支持该架构,否则需要寻找对应的源或手动安装。</think>### Docker CE安装依赖问题解决方案 #### 1. 添加EPEL仓库获取依赖包 ```bash sudo yum install -y epel-release sudo yum update ``` #### 2. 安装基础依赖工具 ```bash sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ``` #### 3. 启用Docker社区版仓库 ```bash sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ``` #### 4. 尝试安装缺少的依赖包 ```bash sudo yum install -y fuse-overlayfs slirp4netns ``` > 若提示找不到包,需检查仓库是否包含aarch64架构的包。可尝试手动下载: ```bash # 从第三方镜像站下载(示例URL需替换为实际地址) wget http://mirror.example.com/aarch64/fuse-overlayfs-1.6-1.el7.aarch64.rpm wget http://mirror.example.com/aarch64/slirp4netns-1.1.8-1.el7.aarch64.rpm sudo rpm -ivh *.rpm ``` #### 5. 强制安装Docker CE ```bash sudo yum install --skip-broken -y docker-ce docker-ce-cli containerd.io ``` #### 6. 验证安装 ```bash sudo systemctl start docker sudo docker run hello-world ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值