Docker rootless 是一种在非特权模式下运行 Docker 守护进程的方式,它允许用户以非 root 用户管理 Docker 守护进程和容器,以降低潜在的安全漏洞风险
介绍
- docker rootless 特性于 2019.7.22 的 v19.03.0 引入,2020.12.8 版本 v20.10.0 GA
- rootless 优点
- 以非 root 用户身份运行容器
- 限制容器的权限
- 限制容器能力
安装
- 以 ubuntu 22.04 为例
- 安装 dbus-user-session
sudo apt-get install -y dbus-user-session
- 安装 uidmap:让 Docker 守护进程运行在重映射的用户名空间中
- subuid/subgid 最大范围
2,147,483,648
即 2^32-1
(参考)
sudo apt-get install -y uidmap
# 安装后,自动生成如下信息
$ whoami
testuser
$ grep ^$(whoami): /etc/subuid
testuser:231072:65536
$ grep ^$(whoami): /etc/subgid
testuser:231072:65536
- 下面定制 subuids/subgids(可忽略)
- 解决错误
failed to Lchown "/path/to/xxx" for UID <uid>, GID <gid> (try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid): lchown /path/to/xxx: invalid argument
sudo touch /etc/sub{u,g}id
sudo usermod --add-subuids 10000-75535 $(whoami)
sudo usermod --add-subgids 10000-75535 $(whoami)
- 安装 slirp4netns(rootless 支持的网络模式参考)
sudo apt-get install -y slirp4netns
$ cat /etc/security/limits.conf
* soft nofile 10240
* hard nofile 10240
$ cat << EOT > /etc/sysctl.conf
user.max_user_namespaces = 28633
EOT
$ sysctl --system
$ cat /proc/sys/net/ipv4/ping_group_range
0 2000000
# 配置命令
sysctl -w "net.ipv4.ping_group_range=0 2000000"
curl -o rootless.sh -fsSL https://get.docker.com/rootless
# 替换国内源
sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' rootless.sh
sh rootless.sh
systemctl --user start docker
systemctl --user enable docker
systemctl --user status docker
# To launch the daemon on system startup, enable the systemd service and lingering
sudo loginctl enable-linger $(whoami)
相关配置文件
~/.config/docker/daemon.json
使用
export PATH=/usr/bin:$PATH
export XDG_RUNTIME_DIR=/run/user/$UID
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock >> ~/.bashrc
或
docker context use rootless
然后可以和正常使用 docker 相关命令