🐧 Linux 総合学習プラットフォーム
コンテナ Docker/Podman ・ 中級

コンテナ運用の基本——再起動・資源・掃除

コンテナを本番に近い形で動かし続けるには、落ちたときにどう復帰させるか、暴走したときにホストをどう守るか、そして不要になったものをどう掃除するかを知っておく必要があります。再起動ポリシー、CPUやメモリの資源制限、docker statsによる監視、docker system pruneでの掃除、healthcheckの考え方まで、運用の土台をひと通り学びます。

コンテナを起動できて、複数を組にして、名前で通信させて、レジストリで配布できるようになった。ここまで来ると、あとは「動かし続ける」段階に入る。

動かし続けるうえで避けて通れないのが、落ちたときの復帰、暴走したときの防御、そして溜まったゴミの掃除だ。この3つを押さえておくと、コンテナ運用の土台が固まる。

つまずき「起動できる」と「動かし続けられる」は別の技術だ。運用の基本を知らないまま本番に近い環境で動かすと、落ちたまま気づかない・ホストごと巻き込まれるといった事故につながる。

🔁 再起動ポリシー

コンテナの中のプロセスが何らかの理由で落ちたとき、コンテナも一緒に停止する。これを自動的に立て直すのが再起動ポリシーだ。docker run --restart オプションで指定する。

よく使われるのがunless-stoppedだ。これは「コンテナが異常終了したら自動で再起動するが、こちらが明示的にdocker stopで止めた場合は再起動しない」という挙動になる。似たものにalwaysもあるが、こちらはホスト再起動後も含めて常に起動しようとする点が異なる。

$ docker run -d --restart unless-stopped --name web myapp のように指定しておくと、アプリが異常終了してもDockerが自動で立て直してくれる。手動でdocker stop webしたときは再起動されない。
💡
ポイントon-failureは失敗時のみ再起動、alwaysは常に再起動を試みる、unless-stoppedは明示停止以外は再起動する。用途に応じて使い分ける。

📏 資源制限——メモリとCPU

コンテナはホストとカーネルを共有しているため、何も制限しないと1つのコンテナがメモリやCPUを使い切り、ホスト全体や他のコンテナを巻き込んで不安定にすることがある。

これを防ぐのが--memoryと--cpusオプションだ。--memoryはそのコンテナが使えるメモリの上限を、--cpusは使えるCPUコア数の上限を指定する。上限を超えるとコンテナ側が制限され、ホストが道連れになるのを防ぐ。

ホスト暴走コンテナ--memory 512m上限で頭打ち他は無事他のコンテナ影響を受けない
🔗
たとえ資源制限は、集合住宅の各部屋にブレーカーを付けるようなものだ。1部屋が電気を使いすぎても、その部屋のブレーカーが落ちるだけで、建物全体が停電するのを防げる。
$ docker run -d --memory 512m --cpus 1.0 --name web myapp のように指定すると、このコンテナはメモリ512MB・CPU1コア分までしか使えなくなる。

📊 docker statsで監視する

資源制限を設定したら、実際にどれくらい使っているかを見たくなる。docker statsは、稼働中の全コンテナのCPU使用率・メモリ使用量・ネットワークの送受信量などをリアルタイムで表示するコマンドだ。

$ docker stats を実行すると、CONTAINER・CPU %・MEM USAGE / LIMITといった列がリアルタイムで更新されながら並ぶ。--memoryで設定した上限に対して実際どれくらい使っているかも、この画面で確認できる。
コツ特定のコンテナだけ見たいときはdocker stats コンテナ名のように対象を絞れる。全部を眺めるより、疑わしい1つに絞ったほうが原因を追いやすい。

🧹 不要物の掃除——docker system prune

コンテナやイメージを作ったり消したりを繰り返していると、使われなくなったイメージ・停止したままのコンテナ・孤立したボリュームやネットワークがホストにどんどん溜まっていく。

docker system pruneは、これらの不要物をまとめて掃除するコマンドだ。停止中のコンテナ、どのコンテナからも使われていないネットワーク、タグの付いていないイメージなどが削除対象になる。

つまずきdocker system pruneは「消える範囲」に注意がいる。既定では未使用のボリュームは消えないが、-a オプションを付けると使われていない全てのイメージまで対象になり、--volumesを付けると未使用ボリュームも消える。実行前に何が消えるかの確認メッセージをよく読む習慣をつける。本番に近い環境でいきなり実行せず、まずdocker system df で現在の使用量の内訳を確認してから、必要な範囲だけ掃除するのが安全だ。

❤️ healthcheckという考え方

コンテナが「起動している」ことと、その中のアプリが「正常に動いている」ことは、実は同じではない。プロセスは生きていても、アプリ内部でデータベース接続が切れていて実質的に応答不能、という状態はありうる。

healthcheckは、コンテナの中で定期的にチェック用のコマンドを実行させ、その結果でコンテナの健康状態を判定する仕組みだ。Dockerfileの中でHEALTHCHECK命令として書くか、compose.yamlのhealthcheck項目で指定する。書き方は、実行するチェックコマンド・確認間隔(interval)・失敗と判定するまでの回数(retries)などをまとめて指定する形になる。

starting起動直後healthyチェック成功unhealthyretries回失敗次を起動OKdocker psで警告
💡
ポイントhealthcheckが失敗し続けると、docker psの表示がunhealthyになり、異常に気づきやすくなる。前のトピックで触れたdepends_onのcondition: service_healthyも、このhealthcheckの結果を見て次のサービスを起動するかどうかを判断している。
🔗
たとえ再起動ポリシーが「倒れたら起こす」対策なら、healthcheckは「顔色を定期的に確認する」対策だ。プロセスが生きているかだけでなく、ちゃんと仕事ができる状態かまで見て、初めて安心して運用に任せられる。

再起動・資源制限・監視・掃除・healthcheck、この5つが揃うと、コンテナは「作って動かす」段階から「任せて動かし続ける」段階に進む。ここまでの積み重ねが、実務でのコンテナ運用の土台になる。

この項目に出てくる用語

再起動ポリシーさいきどうぽりしー
コンテナが停止したときに自動で再起動するかどうかを決める設定。--restartで指定する。
healthcheckへるすちぇっく
コンテナの中身が正常に動作しているかを定期的なコマンド実行で判定する仕組み。

▶ 学習アプリでこの続きを学ぶ・演習する