Docker rootlessコンテナを CGroup V2 なホストLinuxで動かす

Fedora 31 などで[CGroup V2 (unified CGroup 階層)](https://qiita.com/kakinaguru_zo/items/cb18bd8f7aa92c11f6bf) がデフォルトになっているので、そういうLinuxホストで[podman](https://qiita.com/MahoTakara/items/65ff8c2810ca820bc0b3) を用いて動かす話です。手順としてはUbuntu/Debian向けに書いてあります。fedora 31なら `dnf install fuse-overlayfs slirp4netns` をrootで実行してから `dnf install buildah skopeo podman` をrootで実行し、一般ユーザーで`podman info` を実行すれば問題なく一般ユーザーで使えるようになります。Ubuntu Disco 以降およびDebian Bullseyeなら非ルートユーザーによるrootlessコンテナが使えます。Ubuntu Eoan と Fedora 31 でtensorflowのドッカーイメージを問題なく実行できています（下記参照）

# crun, slirp4netns, fuse-overlayfs, containernetworking-plugins のインストール
## Ubuntu の場合
```config:/etc/apt/sources.list
deb http://jp.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
```
```/etc/apt/apt.conf.d/00myconfig
APT::Default-Release "現在使用中のリリース(eoanなど)";
```
を設定してから `apt-get update`, `apt-get -t focal install crun fuse-overlayfs slirp4netns　containernetworking-plugins` する

## Debian の場合
```config:/etc/apt/sources.list
deb http://deb.debian.org/debian testing main contrib non-free
```
```/etc/apt/apt.conf.d/00myconfig
APT::Default-Release "現在使用中のリリース(busterなど)";
```
を設定してから `apt-get update`, `apt-get -t testing install crun fuse-overlayfs slirp4netns containernetworking-plugins` する

# Project Atomic のAPTソースの設定
## Ubuntuの場合（rootで）
```shell-session
apt-get install software-properties-common
add-apt-repository ppa:projectatomic/ppa
```
とすると `/etc/apt/sources.list.d/projectatomic-ubuntu-ppa-eoan.list` が出来るので、それをエディタで開いてリリース名（`eoan`など）を`disco`か`bionic`に変える。これは上記PPAがbionicとdiscoのパッケージしか用意していないからである。

## Debianの場合（rootで）
```config:/etc/apt/sources.listの末尾
deb [ allow-insecure=yes ] http://ppa.launchpad.net/projectatomic/ppa/ubuntu disco main
```
を追加。

# Project Atomicからパッケージインストール (Ubuntu&Debian共通）
` apt-get -t disco install buildah podman skopeo` (discoは前項のリリース名と同じにすること）


# 設定ファイルの変更
1. https://github.com/projectatomic/registries/blob/master/registries.fedora の内容を `/etc/containers/registries.conf` にコピーする
2. `/usr/share/containers/libpod.conf` の中の `runtime = "runc"` の等号の右辺を`"crun"`に変更し保存する

上記の作業で `docker ナントカ`のかわりに`podman なんとか` と打てば同じことができる（ただし`sudo`ではなくて`root`ログインが必要かも知れない）。

# 一般ユーザーでのrootlessコンテナの使用 (Linux カーネル4.18以降が必要)
1. `podman info` を実行し設定ファイルを作る
2. `~/.config/containers/libpod.conf` の`runtime` の項目を`crun`にする
3. `~/.config/containers/storage.conf` の`driver`の項目を`overlay`にし、`mount_program` の項目を`"/usr/bin/fuse-overlayfs"`

とする。

# tensorflowの実行
上記の設定のあとに一般ユーザーで `podman run -it --rm tensorflow/tensorflow:1.15.0-py3  python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"` を一般ユーザーで問題なく実行できた。

# トラブルシューティング
## Error processing tar file(exit status 1): there might not be enough IDs available in the namespace (requested 0:42 for /etc/gshadow): lchown /etc/gshadow: invalid argument
というエラーが一般ユーザーで出たら 

1. `/etc/subuid`, `/etc/subgid` に `自分のログインID:100000:65536` のような行が存在するか確認し、なければ追加する。
2. `~/.config/containers/storage.conf` の`ignore_chown_errors =` の右辺を`"true"`にする。
3. それで`podman run -it ubuntu bash` がエラー無く実行できてドッカーコンテナ内のルートプロンプトが出ることを確認する。

# podman-compose
`docker-compose` に対応するコマンドは上記の作業ではインストールされない。それでは困る場合 `pip3 install -U podman-compose` を用いて`podman-compose`コマンドをインストールする。CGroup V2なUbuntu Eoan上で[LaTeXで年賀状を作る](https://qiita.com/yyu/items/defa9eb6d4cf5e797270) に示されたdockerコンテナを `podman-compose`で動かし年賀状を作成することができた。