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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。