docker 免 root 运行(rootless)在 2019.7.22 的 v19.03.0 引入,在 2020.12.8 的 v20.10.0 GA。本文中使用 docker 版本为 2022.9.9 发布的 v20.10.18。
官方文档
- Ubuntu 下安装 docker:https://docs.docker.com/engine/install/ubuntu/
- 切换 rootless:post-installation steps for Linux
- rootless 从头安装:Run the Docker daemon as a non-root user (Rootless mode)
rootless 从头安装
准备
- 安装
uidmap
apt install -y uidmap- 创建或修改
/etc/security/limits.conf,重新登录会话生效。
# 默认值一般是 1024
# 星号代表所有用户
# soft 是警告值,hard 是硬限制
* soft nofile 5120
* hard nofile 5120- 检查是否生效
$ ulimit -n
5120- 创建或修改
/etc/sysctl.conf
net.ipv4.ip_unprivileged_port_start=80
fs.inotify.max_user_instances=1024- 检查是否生效
# sysctl -p
net.ipv4.ip_unprivileged_port_start = 80
fs.inotify.max_user_instances = 1024- 创建普通用户
useradd qbit -m -s /bin/bash- 设置密码
passwd qbit安装及设置
- 后续操作在普通用户
qbit账号下进行,需要重新登录账号,仅仅切换账号可能报以下错误
Failed to connect to bus: No such file or directory- 安装
docker rootless。国内连docker官网比较慢,可以考虑走代理。
# 设置系统代理
export http_proxy="http://proxy_addr:proxy_port"
export https_proxy="https://proxy_addr:proxy_port"
# 下载安装 rootless 版本 docker
curl -fsSL https://get.docker.com/rootless | sh- 导入环境变量,并将以下环境变量加入
~/.bashrc。id不一样,注意看安装后的提示
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/1001/docker.sock- 启动
docker
systemctl --user start docker- 设置
docker开机启动
systemctl --user enable docker- 查看
docker状态
systemctl --user status docker修改数据目录
- 创建或修改
~/.config/docker/daemon.json
"data-root": "/data/docker/dockerdata"- 重启
docker
systemctl --user restart docker- 查看数据目录
$ docker info | grep Root
Docker Root Dir: /data/docker/dockerdata配置国内镜像源加速
- 创建或修改
~/.config/docker/daemon.json
{
"data-root": "/data/docker/dockerdata",
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}- 重启
docker
systemctl --user restart docker- 查看镜像源
$ docker info | grep -E "Registry|http"
Registry: https://index.docker.io/v1/
Registry Mirrors:
https://docker.mirrors.ustc.edu.cn/
http://hub-mirror.c.163.com/
https://registry.docker-cn.com/Hello World!
$ docker run hello-world
Hello from Docker!nsenter
- 获取容器 pid
# 用容器名
$ docker inspect redis -f '{{.State.Pid}}'
678297
# 用容器 ID
$ docker inspect 2c0b7246f4a1 -f '{{.State.Pid}}'
678297- 用
-U参数,如果报类似错误:nsenter: reassociate to namespace 'ns/net' failed: Operation not permitted
nsenter -U -n -t {pid}- 可以用
ip命令确认自己是否已进入 namespace
ip a本文出自 qbit snap
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。