とあるサーバのOSをメジャーバージョンアップしたところDockerが動かなくなったので調べたことを残しておく。
要点
- OSのメジャーバージョンアップにより、dockerの裏側で仮想化に使われる
cgroup
という仕組みのデフォルトがv1からv2に変わった - 上記の影響で、古いDockerは動かなくなる
- Dockerをバージョンアップする or cgroup v1へダウングレードすると復旧する
事象
とあるサーバのUbuntuを18 (bionic) から22 (jammy) にバージョンアップしたところ、Dockerで動かしているアプリケーションが下記のようなエラーを吐いて起動しなくなった。
$ sudo docker-compose up -d ... ERROR: for postgres Cannot start service postgres: b'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/9f648fb41b164de2277214ec8ffec9a830a73443c3c8f5e5e2506a10a48dcce5/cpuset.cpus.effective: no such file or directory\\"": unknown' ... ERROR: Encountered errors while bringing up the project.
調査
エラーメッセージから
- コンテナそのものの問題ではなさそう (Dockerfileの問題ではなさそう)
- cgroup関連の問題っぽい
ということが読み取れる。エラーメッセージやそれっぽいキーワードでググったところ下記の記事がヒットした。
上記の記事を読んだ結果、下記のような状況と解釈した。
- OSのメジャーバージョンアップによって、dockerの裏側で仮想化に使われる
cgroup
という仕組みがv1からv2に変わった ( Ubuntu 21.10から ) - dockerのバージョンは
19.03.4
で、2019/10/17にリリースされたもの- dockerが古く、cgroup v2に対応して無いのではないか? (推測)
- dockerをバージョンアップする orcgroup v1を使うように設定変更すれば解消しそう (仮説)
解決策1: dockerバージョンアップ
before
$ docker -v Docker version 19.03.4, build 9013bf583a $ sudo docker-compose ps Name Command State Ports ----------------------------------------------------------------------------- redash_adhoc_worker_1 /app/bin/docker-entrypoint ... Exit 137 redash_nginx_1 nginx -g daemon off; Exit 128 redash_postgres_1 docker-entrypoint.sh postgres Exit 128 redash_redis_1 docker-entrypoint.sh redis ... Exit 128 redash_scheduled_worker_1 /app/bin/docker-entrypoint ... Exit 128 redash_scheduler_1 /app/bin/docker-entrypoint ... Exit 128 redash_server_1 /app/bin/docker-entrypoint ... Exit 128
バージョンアップ
# 一度古いdockerを削除 $ sudo apt list --installed docker* Listing... Done docker-ce-cli/now 5:19.03.4~3-0~ubuntu-bionic amd64 [installed,local] docker-ce/now 5:19.03.4~3-0~ubuntu-bionic amd64 [installed,local] $ sudo apt remove -y docker-ce docker-ce-cli ... Removing docker-ce (5:19.03.4~3-0~ubuntu-bionic) ... Removing docker-ce-cli (5:19.03.4~3-0~ubuntu-bionic) ... Processing triggers for man-db (2.10.2-1) ... $ docker -v -bash: /usr/bin/docker: No such file or directory
# 新しいdockerを再インストール $ sudo apt install -y docker.io Reading package lists... Done ... The following NEW packages will be installed: bridge-utils containerd dns-root-data dnsmasq-base docker.io runc ubuntu-fan ... $ docker -v Docker version 24.0.7, build 24.0.7-0ubuntu2~22.04.1
after
$ sudo docker-compose up -d redash_postgres_1 is up-to-date redash_redis_1 is up-to-date redash_server_1 is up-to-date redash_scheduler_1 is up-to-date redash_adhoc_worker_1 is up-to-date redash_scheduled_worker_1 is up-to-date redash_nginx_1 is up-to-date
復旧を確認 ✅
解決策2: cgroup v1を使うように変更
/etc/default/grub
をvimなどで開いて下記のように変更
- GRUB_CMDLINE_LINUX="" + GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0"
grubを更新して、設定変更を反映させるためにサーバを再起動
$ sudo update-grub $ sudo reboot
docker compose up
$ sudo docker-compose up -d redash_postgres_1 is up-to-date redash_redis_1 is up-to-date redash_server_1 is up-to-date redash_scheduler_1 is up-to-date redash_adhoc_worker_1 is up-to-date redash_scheduled_worker_1 is up-to-date redash_nginx_1 is up-to-date
復旧を確認 ✅