网站使用问题,上海seo优化,自己做网站挣钱吗,常用的网络推广方法rootless 简介
rootless模式是指以非root用户身份运行Docker守护程序和容器。那么为什么要有rootless mode呢#xff1f;因为在root用户下安装启动的容器存在安全问题。存在的安全问题具体来说是容器内的root用户就是宿主机的root用户#xff0c;容器内uid1000的用户就是宿主…rootless 简介
rootless模式是指以非root用户身份运行Docker守护程序和容器。那么为什么要有rootless mode呢因为在root用户下安装启动的容器存在安全问题。存在的安全问题具体来说是容器内的root用户就是宿主机的root用户容器内uid1000的用户就是宿主机uid1000的用户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的守护进程有以下几方面的作用
管理容器守护进程能够启动、停止、重启和删除容器以及监控容器的运行状态。管理镜像守护进程能够下载、上传、构建和删除镜像以及管理镜像的版本控制和安全性。管理网络守护进程能够创建和管理Docker容器的网络使得多个容器能够通信和互相访问。管理数据卷守护进程能够管理容器的数据卷以便持久化存储容器中的数据。
总之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需要安装newuidmap和newgidmap工具配置/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_namespaces28633 /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_IPTABLES1然后重新执行 sh docker.sh 将上图中安装过程提示的export内容添加到 $HOME/.bashrc 文件中添加完使用source $HOME/.bashrc 命令使环境变量生效。注意你的环境变量和我的一定不一致要copy上图中红色部分。 [testuserfe2314d04cbd ~]$ cat $HOME/.bashrcEOF export PATH/home/testuser/bin:$PATH export DOCKER_HOSTunix:///run/user/1000/docker.sock EOF [testuserfe2314d04cbd ~]$ 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 dockerdkill -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-userID空间。
当Docker创建一个新的容器时它会在子用户命名空间内为容器创建一个新的用户IDUID。为了使容器能够访问外部文件系统和网络等资源Docker需要将容器的UID映射到主机上的真实UID。
然而由于子用户命名空间的限制只有范围内的UID可以被映射。默认情况下每个用户在/etc/subuid文件中都有一组可用的UID范围。如果该文件没有包含足够多的UID范围那么在创建大量容器时可能会出现UID耗尽的情况因为每个容器都需要一个唯一的UID。
因此为了确保Docker能够创建足够多的容器并避免UID耗尽的问题建议在安装无根Docker时将/etc/subuid文件扩展到包含至少65536个UID范围。这样可以提供足够的UID空间来满足容器的需求并且可以避免因为UID耗尽而导致的容器创建失败的问题。