docker rootless , gpu and other


POST ON 2024-03-24 BY WOLVES

Docker Rootless

Docker Rootless 模式允许用户在不使用 root 权限的情况下运行 Docker 守护进程(Docker daemon)。

这种模式提高了系统的安全性,因为它减少了潜在的攻击面。Docker Rootless 模式允许用户在不使用 root 权限的情况下运行 Docker 守护进程(Docker daemon)。这种模式提高了系统的安全性,因为它减少了潜在的攻击面。

Installation

首先是 Docker,官方已经支持 Rootless 部署,文档在 https://docs.docker.com/engine/security/rootless/ ,使用上分为两步:

1.管理员用 root 权限配置好各项依赖

2.每个用户跑一次 setup 脚本,然后正常用 docker

1.在安装docker后,增加以下依赖

sudo apt install uidmap dbus-user-session fuse-overlayfs slirp4netns docker-ce-rootless-extras

2.安装完以后,每个用户自己执行一个初始化脚本

dockerd-rootless-setuptool.sh install

之后就可以正常使用 docker 了,从 docker info 可以看到目前是 rootless 模式:

docker info | grep Context

说明

  • 在 Docker Rootless 模式下,daemon.json 文件的位置和使用方式与传统的 Docker 安装有所不同。由于 Docker Rootless 模式下 Docker 守护进程(Docker daemon)运行在非 root 用户的环境中,因此 daemon.json 文件的位置也会有所变化。

  • 在 Docker Rootless 模式下,daemon.json 文件通常位于用户的 $HOME 目录下的 .config/docker 目录中。具体路径如下:

~/.config/docker/daemon.json
  • 如果你需要配置 Docker Rootless 模式的守护进程,可以在这个路径下创建或编辑 daemon.json 文件。例如,你可以使用以下命令来创建或编辑该文件:
mkdir -p ~/.config/docker
nano ~/.config/docker/daemon.json
  • 在这个文件中,你可以添加或修改 Docker 守护进程的配置,例如镜像加速器、日志驱动、存储驱动等。以下是一个示例 daemon.json 文件的内容:
{
  "registry-mirrors": ["https://your.mirror.url"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
  • 保存并关闭文件后,Docker Rootless 模式的守护进程会在启动时读取这个配置文件。请确保在修改配置文件后重启 Docker 守护进程以使更改生效。你可以使用以下命令来重启 Docker Rootless 模式的守护进程:
systemctl --user restart docker
  • 或者,如果你使用的是 dockerd-rootless.sh 脚本来启动 Docker 守护进程,可以重新运行该脚本:
dockerd-rootless.sh
  • 这样,Docker Rootless 模式的守护进程将会使用新的配置。



GPU support

为dockerRootless增加GPU支持

/etc/nvidia-container-runtime/config.toml[nvidia-container-cli]下添加

no-cgroups = true

即可为无根运行提供gpu支持

docker run -it --rm --gpus all ubuntu nvidia-smi



容器运行后,如何增加/修改/删除存储卷

首先,关闭容器进入容器目录,目录中一般有如下文件,我们需要修改的就是 config.v2.json 和 hostconfig.json 文件

进入vim后,由于docker默认会将文件格式变为不易读,可以使用python工具进行解析为易读性较好的文件,esc 输入下列文字即可

:%!python -m json.tool

1.修改容器的”config.v2.json”配置文件

在”MountPoints”数组,最后添加宿主机目录”/opt/file”映射到容器的”/file”目录下,如下

"/file": {
            "Source": "/opt/file",
            "Destination": "/file",
            "Driver": "",
            "Name": "",
            "Propagation": "rprivate",
            "RW": true,
            "Relabel": "ro",
            "SkipMountpointCreation": false,
            "Spec": {
                "Source": "/opt/file",
                "Target": "/file",
                "Type": "bind"
            },
            "Type": "bind"
}

2.修改容器的”hostconfig.json”配置文件

在”Binds”数组,最后添加目录映射配置,如下:

"Binds": [
        "/opt/file:/file"
]

最后一步,一定要重启docker进程,否则直接启动容器,docker会把你的修改给还原

# rootless 进程
systemctl --user restart docker

docker login 时出现 x509: certificate signed by unknown authority

  • 首先获取证书公钥
  • 将公钥追加在/etc/ssl/certs/ca-certificates.crt
  • 重启docker