Run the Docker daemon as a non-root user (Rootless mode)

rootless 简介

rootless模式是指以非root用户身份运行Docker守护程序和容器。那么为什么要有rootless mode呢?因为在root用户下安装启动的容器存在安全问题。存在的安全问题具体来说是容器内的root用户就是宿主机的root用户,容器内uid=1000的用户就是宿主机uid=1000的用户,docker的守护进程是root权限的。所以我们有时候需要安装docker rootless来减轻守护程序和容器运行时中的潜在漏洞。

无根模式在用户命名空间内执行docker daemon(docker守护进程)和容器,这与userns remap模式非常相似。只是在userns remmap模式下,守护进程本身以root权限运行,而在无根模式下,后台进程和容器都在没有root权限的情况下运行。

rootless 模式利用 user namespaces 将容器中的 root 用户和 docker 守护进程(dockerd)用户映射到宿主机的非特权用户范围内。

补充介绍

1.docker守护进程

docker的守护进程(docker daemon)是docker的主要后台进程,它负责运行docker容器、管理docker镜像、网络和数据卷等。

具体来说,docker的守护进程有以下几方面的作用:

  1. 管理容器:守护进程能够启动、停止、重启和删除容器,以及监控容器的运行状态。
  2. 管理镜像:守护进程能够下载、上传、构建和删除镜像,以及管理镜像的版本控制和安全性。
  3. 管理网络:守护进程能够创建和管理Docker容器的网络,使得多个容器能够通信和互相访问。
  4. 管理数据卷:守护进程能够管理容器的数据卷,以便持久化存储容器中的数据。

总之,docker的守护进程是docker运行的核心,它为用户提供了快速、高效、安全的容器化解决方案。

2.systemd

systemd是用于管理docker守护进程的服务单元。具体来说,docker的systemd服务单元会在系统启动时自动启动docker守护进程,并监视它的运行状态。如果docker守护进程意外终止,systemd将自动重新启动它。此外,systemd还允许用户通过systemctl命令来管理docker守护进程的状态,例如查看其运行状态、重启和停止等操作。(systemctl start docker 启动docker守护进程)

总之,docker的systemd是docker运行和管理的重要组成部分,它为用户提供了稳定、可靠的docker守护进程管理和监控机制。

安装

官方文档:Run the Docker daemon as a non-root user (Rootless mode) | Docker Docs

 操作系统:Centos7.7.1908

1.前置条件

创建一个普通用户

useradd -m -s /bin/bash testuser

需要安装newuidmapnewgidmap工具,配置/etc/subuid/etc/subuid需要这两个工具的支持。安装之前使用yum install -y uidmap确认下是否已经安装过或者操作系统自带,如果存在就不要安装了。

 说明已经存在了

/etc/suubid/etc/subid中应至少包含用户的65536个从属UID/GID。下面示例中,用户testuser有65536个从属UID/GID。

id -u
whoami
grep ^$(whoami): /etc/subuid
grep ^$(whoami): /etc/subgid

 

root用户下也可以通过以下命令确保用户id关系配置

echo "testuser:100000:65536" | tee /etc/subuid
echo "testuser:100000:65536" | tee /etc/subgid

至此,前置配置准备完毕

2. centos7下rootless模式安装

/etc/sysctl.conf或/etc/sysctl.d文件中修改系统参数user.max_user_namespaces = 28633,修改完成之后执行sysctl --system命令让参数生效。

echo user.max_user_namespaces=28633 >> /etc/sysctl.d/userns.conf
sysctl -p /etc/sysctl.d/userns.conf

该参数默认值是0,即不允许操作系统用户存在subuid空间。

在Citrix中/proc/sys/user/max_user_namespaces也要修改为28633。

接下来需要安装脚本,有两种方案:

一.在新建的用户testuser下,执行以下安装脚本,该方案安装脚本需要连网。

curl -fsSL https://get.docker.com/rootless | sh

脚本执行完成之后,显示的内容如下:

 二.进入https://get.docker.com/rootless该网站将内容全部copy到linux文件中,然后执行。本文新建了一个docker.sh的文件,把内容全部都复制到该文件下了

执行 export SKIP_IPTABLES=1,然后重新执行 sh docker.sh

将上图中安装过程提示的export内容添加到 $HOME/.bashrc 文件中,添加完使用source $HOME/.bashrc 命令使环境变量生效。注意:你的环境变量和我的一定不一致,要copy上图中红色部分。 

[testuser@fe2314d04cbd ~]$ cat >>$HOME/.bashrc<<'EOF'
> export PATH=/home/testuser/bin:$PATH
> export DOCKER_HOST=unix:///run/user/1000/docker.sock
> EOF
[testuser@fe2314d04cbd ~]$ source $HOME/.bashrc

 3.启动守护进程运行容器

在testuser用户下使用下面的脚本启动docker守护进程,该脚本在上文中的环境变量PATH目录下,所以我们不用写全路径。注意:我们这里使用了 --experimental --storage-driver vfs参数启动,linux内核版本会影响存储驱动选择,后文会进行说明。

dockerd-rootless.sh --experimental --storage-driver vfs

 可以看到ip存在问题,具体解决方案如下:

首先,通过which ip看一下

 接着yum install which下载which包,在which ip看一下

 接着通过yum install iproute下载一下,再通过which ip看一下

这样问题就解决了

 之后通过dockerd-rootless.sh --experimental --storage-driver vfs启动docker守护进程,如下图所示,docker的守护进程就已经启动了:

上面已经介绍了,docker的守护进程是docker的核心,必须启动守护进程docker才能正常工作,由于本文docker配置是没有systemd的,因此不能通过systemctl启动守护进程,因此docker要想正常工作,只能在一个终端启动当前docker的守护进程,另一个终端执行docker指令,docker才能正常工作。

 如下图所示,在一个终端启动docker守护进程的前提下,另一个终端可以正常执行docker指令

至此,docker rootless配置完成。

docker rootless若干限制

虽然它很安全,但是存在以下受限因素

目前仅支持以下存储驱动程序:

  • overlay2(仅当使用内核 5.11 或更高版本或 Ubuntu 发行版本的内核运行时,才能够支持这个存储驱动)
  • fuse-overlayfs(仅当使用内核 4.18 或更高版本运行并fuse-overlayfs被安装时)
  • btrfs(仅当使用内核 4.18 或更高版本运行,或者~/.local/share/docker使用user_subvol_rm_allowed挂载选项挂载时)
  • vfs 兼容性最好,但这个存储驱动目前仅能用于实验,不能用于生产
  • 只有在使用 cgroup v2 和 systemd 运行时才支持 Cgroup

补充

在进行本文操作过程中, 还使用了如下命令以及遇到以下问题

1.查看当前系统的内核版本

uname -r
cat /proc/version

以上两条命令都可以

2.如果一个进程退不出去,就可以在另一个终端通过执行以下命令终止该进程

  • ps auxw |grep dockerd
  • kill -9

执行kill -9 -419就可以杀死该进程 

3.修改/proc/sys/user/max_user_namespaces为28633,进入/proc/sys/user/目录下,通过vim直接修改max_user_namespaces,发现不能操作,然后修改max_user_namespaces的权限信息也不能修改。原因:

 centos7 的user当前是 dr-xr-xr-x , 没有写的权限,所以不能对当前user下的任何文件进行修改,而chmod和vim 都需要 /proc/sys/user 写的权限,所以执行不到。因此需要通过echo 28633 > /proc/sys/user/max_user_namespaces来修改。

4.yum provides /usr/sbin/ip 命令的作用是查找并安装包含 /usr/sbin/ip 文件的软件包。yum provides 是一个 yum 命令的子命令,用于查找与给定文件匹配的软件包。在这种情况下,命令是在询问 yum 是否有一个软件包包含 /usr/sbin/ip 文件。如果 yum 找到了匹配的软件包,它会尝试安装该软件包,以便 /usr/sbin/ip 文件可以在您的系统中使用。这通常用于确保系统上的特定文件存在并已正确安装。

5.在安装无根Docker时,需要确保/etc/subuid文件包含至少65536个UID,这是因为Docker使用子用户命名空间来实现无根功能。

子用户命名空间是一种隔离技术,它允许在一个命名空间内创建独立的用户、进程和文件系统视图。在Docker中,通过使用子用户命名空间,容器可以拥有自己的独立的主用户(root)和子用户(sub-user)ID空间。

当Docker创建一个新的容器时,它会在子用户命名空间内为容器创建一个新的用户ID(UID)。为了使容器能够访问外部文件系统和网络等资源,Docker需要将容器的UID映射到主机上的真实UID。

然而,由于子用户命名空间的限制,只有范围内的UID可以被映射。默认情况下,每个用户在/etc/subuid文件中都有一组可用的UID范围。如果该文件没有包含足够多的UID范围,那么在创建大量容器时,可能会出现UID耗尽的情况,因为每个容器都需要一个唯一的UID。

因此,为了确保Docker能够创建足够多的容器并避免UID耗尽的问题,建议在安装无根Docker时,将/etc/subuid文件扩展到包含至少65536个UID范围。这样可以提供足够的UID空间来满足容器的需求,并且可以避免因为UID耗尽而导致的容器创建失败的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux监测进程打开文件

分析问题过程中&#xff0c;追踪进程打开的文件可以在许多不同情况下有用&#xff0c;体现在以下几个方面&#xff1a; 故障排除和调试&#xff1a; 当程序出现问题、崩溃或异常行为时&#xff0c;追踪进程打开的文件可以帮助找出问题的根本原因。这有助于快速定位错误&#x…

RGMII 与 GMII 转换电路设计

文章目录 前言一、RGMII 接口的信号说明二、RGMII 发送的 FPGA 实现方案1. OPPOSITE_EDGE 模式2. SAME_EDGE 模式三、使用 FPGA 实现 RGMII 接口前言 RGMII 是 IEEE802.3z 标准中定义的千兆媒体独立接口(Gigabit Medium Independent Interface)GMII 的一个替代品。相较于 GM…

水果库存系统(SSM+Thymeleaf版)

不为失败找理由&#xff0c;只为成功找方法。所有的不甘&#xff0c;因为还心存梦想&#xff0c;所以在你放弃之前&#xff0c;好好拼一把&#xff0c;只怕心老&#xff0c;不怕路长。 文章目录 一、前言二、系统架构与需求分析1、技术栈1.1 后端1.2 前端 2、需求分析 三、设计…

LeetCode每日一题:1123. 最深叶节点的最近公共祖先(2023.9.6 C++)

目录 1123. 最深叶节点的最近公共祖先 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 原理思路&#xff1a; 1123. 最深叶节点的最近公共祖先 题目描述&#xff1a; 给你一个有根节点 root 的二叉树&#xff0c;返回它 最深的叶节点的最近公共祖先 。 回想一下&…

【深度学习】You Only Segment Once: Towards Real-Time Panoptic Segmentation,YOSO全景分割

论文&#xff1a;https://arxiv.org/abs/2303.14651 代码&#xff1a;https://github.com/hujiecpp/YOSO 文章目录 Abstract1. Introduction2. Related Work3. Method3.1. Task Formulation3.2. Feature Pyramid Aggregator3.3. Separable Dynamic Decoder 4. Experiments4.1. …

潜艇来袭(Qt官方案例-2维动画游戏)

一、游戏介绍 1 开始界面 启动程序&#xff0c;进入开始界面。 2 开始新游戏 点击菜单&#xff1a;File》New Game &#xff08;或者CtrlN&#xff09;进入新游戏。 开始新游戏之后&#xff0c;会有一个海底的潜艇&#xff0c;和水面舰艇对战。 计算机&#xff1a;自动控制…

Leetcode1006笨阶乘

思路&#xff1a;以4为一个分组分别进行处理 class Solution:def clumsy(self, n: int) -> int:answer_dict {0:0,1: 1, 2: 2, 3: 6, 4: 7}if n > 4:answer n * (n - 1) // (n - 2) n - 3n - 4else:print(answer_dict[n])return answer_dict[n]print(answer)while n …

一文巩固Spring MVC的Bean加载机制

目录 一、什么是Spring MVC的Bean 二、Spring MVC的Bean加载机制 三、Spring MVC如何动态装载Bean 一、什么是Spring MVC的Bean 在Spring MVC中&#xff0c;Bean指的是在Spring IoC容器中创建和管理的对象。这些对象可以是普通的Java类&#xff0c;也可以是服务层组件、数据…

Python实现SSA智能麻雀搜索算法优化XGBoost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…

028:vue上传解析excel文件,列表中输出内容

第028个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

JDK源码剖析之PriorityQueue优先级队列

写在前面 版本信息&#xff1a; JDK1.8 PriorityQueue介绍 在数据结构中&#xff0c;队列分为FIFO、LIFO 两种模型&#xff0c;分别为先进先出&#xff0c;后进后出、先进后出&#xff0c;后进先出&#xff08;栈&#xff09; 而一切数据结构都是基于数组或者是链表实现。 在…

C#文件拷贝工具

目录 工具介绍 工具背景 4个文件介绍 CopyTheSpecifiedSuffixFiles.exe.config DataSave.txt 拷贝的存储方式 文件夹介绍 源文件夹 目标文件夹 结果 使用 *.mp4 使用 *.* 重名时坚持拷贝 可能的报错 C#代码如下 Form1.cs Form1.cs设计 APP.config Program.c…

冠达管理:紧盯必要性 追问合理性 再融资问询透露监管新动向

在“活泼资本市场&#xff0c;提振出资者决心”一系列办法落地之后&#xff0c;再融资市场整体已明确收紧&#xff0c;但审阅尺度、相关细则还有待进一步观察。有接受采访的投行人士指出&#xff0c;现在存量项目仍在持续推进&#xff0c;监管审阅要点已在问询环节有较为充沛的…

SQL注入案例

目录 一、简介 二、案例 1.发现注入点 2.寻找注入类型 3.寻找字段数 4.将传参值设为超出数据量的大值&#xff0c;联合查询找到回显位置 5.找到数据库 6.寻找库中的表 7.寻找表中列 8.查看表中数据 附&#xff1a;SQLMap注入 1.输入指令查数据库 2.输入指令查表 3…

2023全国大学生数学建模竞赛C题思路模型代码来啦

目录 一.选题建议先发布&#xff0c;思路模型代码论文第一时间更新&#xff0c;获取见文末名片 二.选题建议&#xff0c;后续思路代码论文 C 题 蔬菜类商品的自动定价与补货决策 各题分析 获取完整思路代码见此处名片 一.选题建议先发布&#xff0c;思路模型代码论文第一时…

matplotlib 使用

import matplotlib.pyplot as plt %matplotlib inlineplt.figure()#创建一个画布 plt.plot([1, 0, 9], [4, 5, 6])#点数据&#xff0c;横坐标&#xff0c;纵坐标&#xff0c;相当于&#xff08;1&#xff0c;4&#xff09;&#xff08;0&#xff0c;5&#xff09;&#xff08;9…

log4qt库的使用

log4qt库的使用 一,什么是log4qt?二,log4qt的下载三,如何集成log4qt?1.在vs2022中集成log4qt的方法:模块一:配置log4qt的步骤步骤一,将下好的log4qt库进行解压,然后再库文件中,新建build和Log4Qt文件夹步骤二,打开cmake,有两个填写路径的位置.步骤三,点击cmake的configure按钮…

C高级day2

作业 写一个1.sh脚本&#xff0c;将以下内容放到脚本中&#xff1a; 在家目录下创建目录文件&#xff0c;dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3稳定性

在当今的互联网时代,稳定性是所有系统和应用程序的关键要素。无论是大型数据中心还是个人电脑,稳定性都是保证正常运行和用户体验的基础。在这个背景下,我们来谈谈 Milvus,一个开源的向量数据库,它在 2.1.0 版本中引入了内存多副本的概念。 Milvus 是一个开源的向量数据库…

redhat7.6安装weblogic12c

目录 一、环境准备 二、使用root创建用户和组 三、创建部署目录 四、上传安装包 五、创建 oraInst.loc 文件 六、创建wls.rsp 响应文件 七、进行安装 八、使用 wlst.sh 离线模式创建一个域 九、启动服务 十、浏览器访问 一、环境准备 REDHAT版本&#xff1a;Redhat…