Fedoraを31にしたらdockerコンテナが起動しなくなったのでpodmanを利用することに。

TL:DR

  • Fedoraを31に上げたらdockerコンテナが起動しないようになった。
  • podmanを利用することでコンテナを起動できるようになった。

詳細

症状

fedoraのバージョンアップ後、docker runしたら以下のエラーが発生しコンテナが起動しないという状態に。

# docker run -d --name postgresL -e POSTGRES_PASSWORD=<パス> -p 54321:5432 postgres:latest
5a6e4fe55fccf773946658ea1511d1aca7dd570ea80095fb5b71111ed79e2b74
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:297: applying cgroup configuration for process caused \"open /sys/fs/cgroup/docker/cpuset.cpus.effective: no such file or directory\"": unknown.

原因

詳細は以下のサイトを参照ください。ありがたや。

medium.com 英語なのでかいつまんで要約すると次の通りです。

  • コンテナ実現の重要な要素技術にcgroupがあるが、Fedora 31からこれのバージョンが上がりv2がデフォルトで有効になるように。
  • ...が、docker含むほとんどのコンテナ実装がcgroup v2を未サポートのため動作しない。

対処

対応方法は大きく2通り。引き続き先のサイトから要約します。

  • cgroup v1を利用するようにsystemdの設定を変更する。コマンドは以下。
    • この方法ではdockerを引き続き利用可能。
$ sudo dnf install -y grubby && \
  sudo grubby \
  --update-kernel=ALL \
  --args=”systemd.unified_cgroup_hierarchy=0"
  • dockerの代わりにcgroup v2互換のコンテナエンジンであるpodmanを利用する。
  • この方法ではcgroup v2の恩恵を享受できる。
  • メンテナ推奨の方法はこっち。

今回の事例で選択したのは2の方法。1の方法は未検証なのでご注意を。

podman

podmanについて

以下podmanについて。ほぼほぼdnf infoより。

  • デーモンレスのシンプルなコンテナエンジン。
  • Docker-CLI互換のコマンドを提供。 ** docker=podmanとエイリアシングすることで、今までのdockerコマンドでpodmanを利用可能なくらいらしい。
  • ほとんどのpodmanコマンドは一般ユーザー権限で実行可能

利用側の立場から考えると一般ユーザー権限で実行可能なことが恩恵大きそう。

検証

■ インストール

dnf installでさくっと入ります。

# dnf install podman
...
インストール済み:
  podman-2:1.6.2-2.fc31.x86_64                                             fuse-overlayfs-0.6.5-2.fc31.x86_64                                libvarlink-util-18-2.fc31.x86_64        
  podman-manpages-2:1.6.2-2.fc31.noarch                                    slirp4netns-0.4.0-20.1.dev.gitbbd6f25.fc31.x86_64                 conmon-2:2.0.2-1.fc31.x86_64            
  containernetworking-plugins-0.8.2-2.1.dev.git485be65.fc31.x86_64         containers-common-1:0.1.39-2.2.dev.git1cf1e06.fc31.x86_64         crun-0.10.2-1.fc31.x86_64               

完了しました!

■ イメージの確認

dockerと代わりなし。当たり前だけどdockerのときのイメージは参照できませんでした・・・。

$ podman images
REPOSITORY   TAG   IMAGE ID   CREATED   SIZE

■ イメージの取得

$ podman pull postgres:latest
Trying to pull docker.io/library/postgres:latest...
...

$ podman images
REPOSITORY                   TAG      IMAGE ID       CREATED       SIZE
docker.io/library/postgres   latest   f88dfa384cc4   2 weeks ago   356 MB

■ コンテナの起動。

$ podman run -d --name postgreLatest -e POSTGRES_PASSWORD=<パスワード> -p 54321:5432 postgres:latest
...
$ podman container ls
CONTAINER ID  IMAGE                              COMMAND   CREATED         STATUS             PORTS                    NAMES
89dc98227591  docker.io/library/postgres:latest  postgres  12 seconds ago  Up 11 seconds ago  0.0.0.0:54321->5432/tcp  postgreLatest

■ コンテナサービス(PostgreSQL)へ接続確認

$ psql -h localhost -p 54321 -U postgres
ユーザ postgres のパスワード: 
psql (11.5、サーバ 12.0 (Debian 12.0-2.pgdg100+1))
警告: psql のメジャーバージョンは 11 ですが、サーバのメジャーバージョンは 12 です。
         psql の機能の中で、動作しないものがあるかもしれません。
"help" でヘルプを表示します。

postgres=# \d

ようやっと起動できた。

注意点

いくつかのケースでdocker非互換なので注意。らしいです。 詳細は先のサイ(