Rootless Dockerを構築

モチベーション

これまで、dockerではなくsingularityコンテナを使っていた。dockerの利用を避けていたのは、コンテナ起動にroot権限が必要となるから。自宅での運用なので気にすることはないのだけど。

きっかけは忘れてのだけど、dockerに通常のユーザモードで実行できるrootlessモードというのがあることを知ったので、今回試してみることにする。

情報源

前提

自分の環境には、既にdockerはインストールしているので、docker本体、nvidia-docker2のインストールしてあることが前提である。すなわち、既にdockerを(rootfullで)使っている人が、rootlessで使うための手順として参考にして欲しい。

準備

先ずは、現状の(rootfullな)dockerデーモンを停止する。

$ sudo systemctl disable --now docker.service docker.socket

次に、必要となるパッケージをインストールする。

$ sudo apt install uidmap

自分の環境では、subuid、subgidは次のように既に設定されていた。myuidとmygidは自分のUID/GID。

$ cat /etc/subuid
myuid:100000:65536
$ cat /etc/subgid
mygid:100000:65536

/etc/nvidia-container-runtime/config.toml中のno-cgroups=trueに変更する。(元々は#no-cgroups=false)

この変更を忘れると、GPUを使うと次のようなエラーとなる。

$ docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
(途中省略)
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: mount error: failed to add device rules: open /sys/fs/cgroup/devices/user.slice/devices.allow: permission denied: unknown.

スクリプトの実行、設定

まずは、rootless modeに設定するシェルスクリプトを実行する。

$ dockerd-rootless-setuptool.sh instal

上記のスクリプト実行が終わると、以下を実行すると、自分のユーザでdocker.serviceが起動されていることがわかる。

$ systemctl --user status docker
(出力は略)

最後に、.bashrcの最後に以下を追加する。

export DOCKER_HOST=unix://${XDG_RUNTIME_DIR}/docker.sock

因みに、XDG_RUN_TIME_DIRは次のように設定されている。

$ echo $XDG_RUNTIME_DIR
/run/user/1000

動作確認

$ dokcer run hello-world
(出力は略)

GPUを使うコンテナの場合、次で確認する。

$ docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
(出力は略)

まとめ

rootlessの設定は、/etc/nvidia-container-runtime/config.tomlの変更を忘れずに実施すれば、比較的簡単。自分は、変更を忘れて、少し焦ったけど。

今後は、dockerを使っていきたい。