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非互換なので注意。らしいです。 詳細は先のサイ(