概要
最近のFedoraやCentOSでは、Dockerを使う際に、cgroupに起因するエラーが、発生する可能性があります。
ここでは、そのエラーを解決する方法について紹介します。
環境
- Fedora 32
- Docker 19.03.8
エラー内容
Fedoraでは、Dockerがパッケージとして提供されているので、それを使ってDockerを実行します。
$ sudo dnf install moby-engine
moby-engineというパッケージ名になっているのは、商標の関係でDockerという名前を使わないことにしているからのようです。またmoby-engineはDockerの元となっているものであるので、基本的にDockerとmoby-engineは同じものと考えて大丈夫ということのようです。
Dockerを使ってコンテナを起動すると次のようなエラーが発生します。
docker: Error response from daemon: OCI runtime create failed: this version of runc doesn’t work on cgroups v2: unknown.
エラーの内容として、cgroupgs v2では動かないということを言っているようです。
原因
エラーで、cgroups v2では動かないと言っていますが、これはどういうことなのでしょうか。
調べたところによると、cgroupはCPUやメモリ、ストレージ、ネットワークのリソースの管理・制限をすることができるLinuxカーネルの機能のようです。
しかし、cgroupには、v1とv2の二つのバージョンがあるようで、現在Dockerではv1にしか対応していないということで、v2を実行しているためエラーが発生したということのようです。
Fedora以外のOSでもこのようなエラーが発生しているのかを調べたのですが、cgroup v2を使っているのは、確認したところFedoraやCentOSだけのようで、UbuntuやDebianではv1を使っているため、このようなエラーは発生しないようです。
解決方法
この問題の解決方法は2つあるようです。
1つは、PodmanというRedHatが開発しているDockerライクなコンテナ実行ツールを使うというものです。
Podmanでは、cgroup v2に対応しているため、ただインストールしただけで、Dockerライクにコンテナを使うことができます。
しかし、あくまでもDockerライクであるため、完全にDockerと同じように実行できるわけではありません。
実際に私の場合は、Podmanを使って内部でDockerを使うソフトを実行しようとすると、デーモンがないため起動できないというエラーが発生しました。デーモンがないとは、PodmanはDockerと違いデーモンレスなため、直接デーモンにアクセスして実行するようなツールとは相性が悪いということだと思います。
そのため、Podmanを使うという方法は諦めました。
2つめの方法は、cgroup v2を使って起動していたOSをcgroup v1を使って起動するようにするという方法です。
この方法は、起動時にオプションとしてcgroup v1で起動するように設定します。
設定は、次のコマンドでできます。
$ sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
設定後は、再起動をします。
私はこれで、Dockerでコンテナを実行するようになりました。
さいごに
Dockerは内部でruncというものを使っているのですが、cgroupはそのruncが使用しています。
現在runcではcgroup v2の対応が完了しているようなので()、Dockerをcgroup v2で実行できるようになるのは時間の問題だと思われます。
おそらく、次のメジャーバージョンではcgroup v2に対応しているものと思います。