FedoraでDockerを使うと発生するcgroupのエラーの解決方法

Tips
2020年05月24日 10:00

概要

最近の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に対応しているものと思います。