【Docker】コンテナランタイムの追加方法

# 0. はじめに
本稿では、Ubuntu環境にて**コンテナランタイムを追加する方法**を示します。特定のコンテナランタイムに限った話ではありませんが、説明の都合上、今回はcrunを追加する方法を紹介します。

## 0.1 前提条件
参考として、OS、カーネル、Dockerのバージョン情報を示します。
```
# uname -ov
#59~20.04.1-Ubuntu SMP Thu Jun 16 21:21:28 UTC 2022 GNU/Linux

# uname -r
5.13.0-52-generic

# sudo docker -v
Docker version 20.10.17, build 100c701
```
# 1. 利用可能なコンテナランタイムの確認
以下のコマンドで**利用可能なコンテナランタイムのリスト**（**Runtimes**）と**デフォルトのコンテナランタイム**（**Default Runtime**）を確認できます。
```
# sudo docker info | grep -i runtime
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
```
例えば、Runtimesの中にある**io.containerd.runc.v2**をコンテナランタイムとして利用したい場合は、以下のように、--runtimeのオプションを用いてコンテナを作成します。
```
# sudo docker run --runtime=io.containerd.runc.v2 --name=test-hello hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

（省略）
```
以下のように、作成したコンテナのコンテナランタイムを確認すると、io.containerd.runc.v2が利用されていると分かります。
```
# sudo docker inspect test-hello | grep -i runtime
            "Runtime": "io.containerd.runc.v2",
            "CpuRealtimeRuntime": 0,
```
一方で、Runtimesに登録されていないコンテナランタイムを指定すると、以下のようなエラーとなります。
```
# sudo docker run  --runtime=crun hello-world
docker: Error response from daemon: Unknown runtime specified crun.
See 'docker run --help'.
```
これまでの手順から分かるように、**利用したいコンテナランタイム**を**Runtimes**に追加すれば、コンテナランタイムとして利用できると分かります。

# 2. 利用したいコンテナランタイムをRuntimesに追加
一言で説明すると、**/etc/docker/daemon.json**に**コンテナランタイムの実行パスを記載**します。
以降は、具体的なコンテナランタイムとしてcrunを対象とした説明をします。
## 2.1 crunのインストールと実行パスの確認
先ずは、crunをインストールします。
```
# sudo apt install crun 
```
実行パスを確認します。
```
# which crun
/usr/bin/crun
```
## 2.2 crunをRuntimesに追加
/etc/docker/daemon.jsonにcrunの実行パスを追加します。
尚、/etc/docker/daemon.jsonが作成されていない場合は、新規に作成します。
```/etc/docker/daemon.json
{
  "default-runtime": "runc",
  "runtimes": {
    "crun": {
      "path": "/usr/bin/crun"
    }
  }
}
```
dockerデーモンを再起動して設定を反映させます。
```
# sudo systemctl restart docker
```
利用可能なコンテナランタイムリスト（Runtimes）を確認すると、crunが追加されていると分かります。
```
#  sudo docker info | grep -i runtime
 Runtimes: crun io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
```
## 2.3 動作確認
コンテナランタイムとしてcrunを指定したコンテナを作成します。
```
# sudo docker run  --runtime=crun --name=crun-hello hello-world
unknown seccomp syscall `close_range` ignored
unknown seccomp syscall `epoll_pwait2` ignored

Hello from Docker!
This message shows that your installation appears to be working correctly.

（省略）
```
[seccompのアラート（unknown seccomp syscall xxx）](https://matsuand.github.io/docs.docker.jp.onthefly/engine/security/seccomp/)が気になる場合は、--secyruty-opt seccomp=unconfinedのオプションを付けるとなくなります。
```
# sudo docker run  --runtime=crun --name=crun-hello --security-opt seccomp=unconfined hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

（省略）
```
作成したコンテナのランタイムを確認すると、無事にcrunが指定されているとわかります。
```
# sudo docker inspect crun-hello | grep -i runtime
            "Runtime": "crun",
            "CpuRealtimeRuntime": 0,
```
# 3. まとめ
Ubuntu環境にて利用可能な**コンテナランタイムを追加する方法**を紹介しました。

# 参考
https://github.com/containers/crun/issues/37

https://matsuand.github.io/docs.docker.jp.onthefly/engine/security/seccomp/