プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/08/19

overlayroot 環境内で docker を使う方法

event_note2022/08/19 9:42

overlayroot でルートファイルシステムを読み取り専用にしたところ、docker が使えなくなりました。

OS は Ubuntu 20.04 です。
overlayroot を有効にする方法などについては以前の記事を参考にしてください。

問題点

Docker がインストールされている環境で、overlayroot でルートファイルシステムを読み取り専用にした場合、docker コマンドを実行すると以下のようなエラーが発生します。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

いろいろ調べてみた結果、基本的に overlayroot が有効な状態では docker は使えないようです。
一応以下にあるやり方で docker コンテナを立ち上げるところまではできました。

しかし、そもそも Docker ボリュームには DB のデータなどを逐次格納していっているので、tmpfs 上(=メモリ上)だとメモリがすぐ枯渇してしまいそうです。
また、Docker コンテナ・イメージをアップデートしたい場合にも困ります。

というわけで、少なくとも /var/lib/docker の領域はパーティションを分けるしかないじゃないかというところに行き着きました。
以下のページでも書き込み可能としたい場合はパーティションを分ける方法が紹介されています。

また、Docker に関するベストプラクティスでも、コンテナ用にパーティションを分けるとあります。

その上で、Docker コンテナも read-only で起動すれば、ルートファイルシステムだけでなく Docker コンテナも保護できそうです。

対処方法

とりあえず以下のようにパーティションを分けることで overlayroot と docker の共存ができました。

パス マウントポイント
/dev/sda1 EFI システムパーティション
/dev/sda2 /
/dev/sda3 /var

この状態で overlayroot をインストールし、/etc/overlayroot.local.confoverlayroot="tmpfs:recurse=0" を記載します。 コマンド一発でやる場合は以下です。

$ echo 'overlayroot="tmpfs:recurse=0"' | sudo tee -a /etc/overlayroot.local.conf

overlayroot のインストールや設定については以前の記事を参考にしてください。

今回はルートファイルシステムのみを読み取り専用にするので、tmpfs:recurse=0 を指定するらしいです。
以下が参考になりました。

これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、/var は読み書き可能な状態となります。
docker も普通に使えました。