Docker daemon.json の設定:ディスク容量不足と本番サーバーのダウンを防ぐ

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

午前2時の悪夢:ディスク使用率100%

突然サーバーがダウンして、夜通し対応した経験はありませんか? 私も同じような経験があります。シンプルなNode.jsのWebアプリを動かしているだけなのに、VPSからディスク容量100%の警告が届きました。du -sh /var/lib/dockerコマンドで調査したところ、ログディレクトリが50GB以上も占有していることに愕然としました。

失敗の原因は、Dockerのデフォルト設定をそのままにしていたことでした。実際、Docker Engineは多くの環境との互換性を重視して設計されており、本番環境ですぐに最適に動作するようにはなっていません。システムを安定させるには、/etc/docker/daemon.jsonファイルをマスターする必要があります。

クイックスタート:安眠のための標準設定

以下は、私がUbuntu 20.04/22.04のサーバーでよく適用している設定ファイルです。これを/etc/docker/daemon.jsonにコピーするだけで、一般的な問題をすぐに解決できます。

{
  "storage-driver": "overlay2",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "5"
  },
  "live-restore": true,
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65535,
      "Soft": 65535
    }
  }
}

適用する前に、構文エラーがないか忘れずに確認しましょう:

sudo dockerd --validate-config

結果が空(エラーなし)であれば、サービスを再起動します:

sudo systemctl restart docker

技術解説:なぜこれらのパラメータが重要なのか?

1. Storage Driver:overlay2を最優先

旧バージョンのDockerではaufsdevicemapperが使われていましたが、現在はoverlay2が「ゴールデンスタンダード」です。レイヤー管理が効率的で、I/O速度も優れています。これにより、CPU負荷の軽減とディスク上のInode節約が可能になります。

注意:稼働中のサーバーでドライバーを変更すると、Dockerは古いイメージを見つけられなくなります。すべてのデータを最初からプルし直す必要があります。

2. Logging Driver:生存のための制限

デフォルトでは、Dockerはコンテナが出力するすべて(stdout/stderr)をJSONファイルに記録し、それを永久に保持します。秒間1,000リクエストを処理するアプリの場合、ログファイルは1日で数GBも増加する可能性があります。

  • "max-size": "20m":各ログファイルの最大サイズを20MBに制限します。
  • "max-file": "5":直近の5ファイルのみを保持します(1コンテナあたり合計100MB)。

この設定により、デバッグに必要なデータを確保しつつ、ディスク容量を使い果たす心配がなくなります。

3. Live Restore:メンテナンス時の稼働率維持

通常、システム更新のためにDockerデーモンを再起動すると、すべてのコンテナも停止してしまいます。live-restore機能を有効にすると、デーモンの再起動中もコンテナを実行し続けることができます。これはサービスの無停止稼働(ゼロダウンタイム)を実現するための生命線です。


高度なリソース最適化

ストレージ先をセカンダリディスクに変更する (data-root)

多くのVPSではデフォルトの/パーティションが比較的小さく設定されています。もし500GBのSSDを/dataにマウントしているなら、データが肥大化してOSがフリーズするのを防ぐために、Dockerの保存先をそこに向けましょう。

{
  "data-root": "/data/docker-data"
}

ファイルディスクリプタの制限 (ulimits)

Nginxやデータベースが大量の接続を処理する場合、同時に多くのファイルを開く必要があります。デフォルトの制限値(通常1024)は、高負荷環境では低すぎます。nofileを65535に設定することでコンテナの動作を安定させ、「Too many open files」エラーによるアプリのクラッシュを防ぎます。


運用現場での実践的な経験

長年システムを管理してきた中で、私が導き出した3つの不変のルールを紹介します。

  1. JSONはミスを許さない: ファイル末尾にカンマが一つ多いだけで、Dockerは起動を拒否します。常にvalidateコマンドやjqツールを使ってチェックしてください。
  2. 集中管理: LoggingやUlimitsの設定は、個別のDocker Composeファイルに書くのではなく、デーモンレベルで行いましょう。これにより、サーバー上のすべてのコンテナが一貫した標準に従うようになります。
  3. 固定DNS設定: コンテナから外部APIを呼び出せないエラーが発生した場合は、daemon.json内でDNSをGoogleやCloudflareに強制的に向けてみてください:
    "dns": ["8.8.8.8", "1.1.1.1"]

最初に5分かけてdaemon.jsonを最適化するだけで、後々のトラブル対応に費やす何時間もの時間を節約できます。今すぐあなたのサーバーを確認してみてください!

Share: