docker 免 root 运行(rootless)在 2019.7.22 的 v19.03.0 引入,在 2020.12.8 的 v20.10.0 GA。本文中使用 docker 版本为 2022.9.9 发布的 v20.10.18

官方文档

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
  • 导入环境变量,并将以下环境变量加入 ~/.bashrcid 不一样,注意看安装后的提示
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

qbit
268 声望279 粉丝