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

news2024/11/24 11:31:50

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.coloradmin.cn/o/949942.html

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

相关文章

csp认证真题——重复局面——Java题解

目录 题目背景 问题描述 输入格式 输出格式 样例输入 样例输出 样例说明 子任务 提示 【思路解析】 【代码实现】 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以…

vscode 清除全部的console.log

在放页面的大文件夹view上面右键点击在文件夹中查找 console.log.*$ 注意&#xff1a;要选择使用正则匹配 替换为 " " (空字符串)

多线程应用——单例模式

单例模式 文章目录 单例模式一.什么是单例模式二.如何实现1.口头实现2.利用语法特性 三.实现方式&#xff08;饿汉式懒汉式&#xff09;1.饿汉式2.懒汉式3.线程安全的单例模式4.双重检查锁5.禁止指令重排序 一.什么是单例模式 单例模式&#xff08;Singleton Pattern&#xff…

数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式

文章目录 一、目标检测1.1 labelImg1.2 介绍1.3 安装1.4 使用1.5 转换1.6 验证 二、图像分割2.1 labelme2.2 介绍2.3 安装2.4 使用2.5 转换2.6 验证 一、目标检测 1.1 labelImg 1.2 介绍 labelImg是一个开源的图像标注工具&#xff0c;用于创建图像标注数据集。它提供了一个…

2023-08-30 LeetCode每日一题(到家的最少跳跃次数)

2023-08-30每日一题 一、题目编号 1654. 到家的最少跳跃次数二、题目链接 点击跳转到题目位置 三、题目描述 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位置&#x…

OpenCVSharp入门学习①-获取本地摄像头数据

1. nuget包安装opencvsharp4和opencvsharp4.extensiongs和opencvsharp4.runtime.win 如果不安装opencvsharp4.runtime.win的话会报 System.TypeInitializationException:““OpenCvSharp.Internal.NativeMethods”的类型初始值设定项引发异常。”DllNotFoundException: 无法加…

vue v-for 例子

vue v-for 例子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…

AssemblyManager 程序集管理器

AssemblyManager 程序集管理器 程序执行中使用反射对框架的搭建有着强大的影响&#xff0c;如何管理程序集方便使用反射获取类型操作对象是本文章的重点 1.AssemblyInfo 对于一个程序集这里使用一个AssemblyInfo对象进行管理 Assembly &#xff1a;对应的程序集AssemblyTyp…

Java多线程与并发编程

课程地址&#xff1a; https://www.itlaoqi.com/chapter.html?sid98&cid1425 源码文档&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WMvM3j6qhyjIeAT87kIcxg 提取码&#xff1a;5g56 Java多线程与并发编程 1-并发背后的故事什么是并发 2-你必须知道线程的概念程…

Cadence网表导出常见错误

前言 好不容易绘制出来原理图&#xff0c;结果导出报了很多条错误&#xff0c;由于哥们还是小白&#xff0c;所以很多事情还不懂&#xff0c;有错误的地方希望大佬们能够指出&#xff0c;主要还是以我遇到的为主。 生成网表时候的常见错误 36002-封装名缺失 36003-多part器…

pdf怎么调整大小kb?一分钟学会pdf压缩

PDF是一种常见的文件格式&#xff0c;有时候我们需要将PDF文件的大小进行压缩&#xff0c;以便于传输或存储&#xff0c;那么怎么调整PDF文件的大小呢&#xff1f;接下来就给大家分享几个简单又实用的方法&#xff0c;帮助我们轻松解决PDF文件过大的问题。 方法一&#xff1a;嗨…

【高等数学重点题型篇】——一元函数微分学的应用

本文仅用于个人学习记录&#xff0c;使用的教材为汤家凤老师的《高等数学辅导讲义》。本文无任何盈利或者赚取个人声望的目的&#xff0c;如有侵权&#xff0c;请联系删除&#xff01; 文章目录 一、证明f ( n ) \ ^{(n)} (n)(ξ) 0二、待证结论中只有一个中值ξ&#xff0c;不…

【编译原理】课程一:编译原理入门

目录 1.为什么要学习编译原理 2.什么是编译原理 3.编译与计算机程序设计语言的关系 3.1.程序设计语言的转换方式 3.2.编译的转换过程 3.3.编译器在语言处理系统中的位置 3.4.编译系统的结构 3.4.1.词法分析(扫描) 3.4.2.语法分析(parsing) 3.4.1.1.语法分析的定义 3…

四轴飞行器的电池研究(MatlabSimulink仿真)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python教程(11)——Python中的字典dict的用法介绍

dict的用法介绍 创建字典访问字典修改字典删除字典字典的相关函数 列表虽然好&#xff0c;但是如果需要快速的数据查找&#xff0c;就必须进行需要遍历&#xff0c;也就是最坏情况需要遍历完一遍才能找到需要的那个数据&#xff0c;时间复杂度是O(n)&#xff0c;显然这个速度是…

Canvas实现3D效果

3D 球 效果图 代码 var canvas document.getElementById("cas"),ctx canvas.getContext("2d"),vpx canvas.width / 2,vpy canvas.height / 2,Radius 150,balls [],angleX Math.PI / 1000,angleY Math.PI / 1000,factor 0.0001 //旋转因子var An…

解决方案 | 法大大电子签为保险行业加个“双保险”

近年来&#xff0c;人们自我保障意识的不断增强&#xff0c;带动了保险行业的蓬勃发展&#xff1b;数字化进程的加快&#xff0c;也让保险签署更加便捷高效。但与此同时&#xff0c;对于保险企业的安全合规化要求也在不断提升&#xff0c;电子签作为企业数字化转型的重要抓手&a…

vue3集成bpmn.js

1 安装依赖 npm install bpmn-js npm install bpmn-js-properties-panel npm install camunda-bpmn-moddle 注意依赖会有冲突&#xff0c;最好按照下列版本来安装&#xff1a; "bpmn-js": "^7.3.1", "bpmn-js-properties-panel": "^0.37.…

量子计算机使模拟化学反应减慢了1000亿倍!

悉尼大学(University of Sydney)的科学家们首次利用量子计算机设计并直接观测了化学反应中的一个关键过程&#xff0c;将其速度减慢了1000亿倍。 “Direct observation of geometric-phase interference in dynamics around a conical intersection” 主要作者Vanessa Olaya Ag…