モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

Ubuntu 18 → 22にアップグレードしたらDockerが動かなくなった

とあるサーバの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関連の問題っぽい

ということが読み取れる。エラーメッセージやそれっぽいキーワードでググったところ下記の記事がヒットした。

kussaka.hatenablog.com

jjasghar.github.io

medium.com

上記の記事を読んだ結果、下記のような状況と解釈した。

  • 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

復旧を確認 ✅