Dockerデーモンをdaemon.jsonで設定する方法|ログ設定・insecure-registries・live-restoreの実践手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Docker > Dockerデーモンをdaemon.jsonで設定する方法|ログ設定・insecure-registries・live-restoreの実践手順
「Dockerを本番サーバーで運用しているが、コンテナのログが/var/lib/docker/containers/以下に無制限に積み上がり続けている」「社内プライベートレジストリにdocker pullしようとしたら『http: server gave HTTP response to HTTPS client』というエラーが出て先に進めない」

こういった現場のトラブルを一括解決するのが、Dockerデーモンの設定ファイル daemon.json です。デフォルト設定のままでは、ログ肥大化・HTTPレジストリへの接続拒否・デーモン再起動時のコンテナ強制停止など、本番運用でよく踏む落とし穴があります。

この記事では、/etc/docker/daemon.json の基本構造から、ログローテーション・insecure-registries・live-restore・data-rootの実務設定まで、Ubuntu 24.04 LTS / RHEL 9.4の実機出力を交えて解説します。

この記事のポイント

・daemon.jsonは/etc/docker/daemon.jsonに置き、JSON形式でDockerデーモン全体の挙動を制御する
・"log-driver"と"log-opts"でコンテナのデフォルトログサイズ・ファイル数を一括制限できる
・insecure-registriesでHTTP接続のプライベートレジストリを許可する
・dockerd --validateで構文エラーを事前確認してからsystemctl restart dockerで反映する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

daemon.jsonとは何か

daemon.json は、Dockerデーモン(dockerd)の起動時設定をJSON形式で記述するファイルです。Linuxでは /etc/docker/daemon.json に配置することで、systemctl start docker 時に自動で読み込まれます。

daemon.jsonで制御できる設定範囲は幅広く、次のカテゴリに分類できます。

ロギング設定:デフォルトのlog-driver・log-opts(max-size・max-file・compress)
ストレージ設定:storage-driver(overlay2など)・data-root(データ保存先ディレクトリ)
レジストリ設定:insecure-registries(HTTPレジストリ許可)・registry-mirrors(ミラー設定)
ランタイム設定:live-restore(デーモン再起動時のコンテナ維持)・default-ulimits
ネットワーク設定:bip(Dockerブリッジアドレス)・fixed-cidr

コマンドラインオプション(dockerd --log-driver json-file 等)でも設定できますが、daemon.jsonに集約すれば「設定のgit管理」「Ansible・Terraformによる再現性のある環境構築」が実現できます。現場での標準は daemon.json 管理一択です。

daemon.jsonの基本設定手順

1. daemon.jsonの場所を確認する

Dockerインストール直後に /etc/docker/ ディレクトリが存在するか確認します。

# /etc/docker/ ディレクトリの確認(Ubuntu 24.04 / RHEL 9.4 共通) $ ls -la /etc/docker/ total 16 drwx--x--x 2 root root 29 Aug 10 09:03 . drwxr-xr-x 84 root root 8192 Aug 10 09:03 .. -rw------- 1 root root 244 Aug 10 09:03 key.json # daemon.json が存在しない場合は新規作成する $ sudo touch /etc/docker/daemon.json # エディタで編集する(viまたはnano) $ sudo vi /etc/docker/daemon.json

インストール直後は daemon.json が存在しないことが多いため、sudo touch で空ファイルを作成してから編集します。

最もよく使われる「ログローテーション設定」を追加したdaemon.jsonの基本形は次のとおりです。

# /etc/docker/daemon.json(ログローテーション設定例) { "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }

この設定で各コンテナのログは最大100MB・最大3ファイルに制限されます。デフォルトは無制限なため、長期運用サーバーでは必ず設定してください。

2. dockerd --validateで構文チェックする

daemon.jsonを編集したら、Dockerを再起動する前に必ず構文チェックを実行します。JSONの構文エラーがあるとDockerが起動できなくなるためです。

# daemon.json の構文チェック(エラーがなければ何も出力されない) $ sudo dockerd --validate --config-file /etc/docker/daemon.json # JSON構文エラーがある場合の出力例(末尾のカンマを付け忘れた場合) $ sudo dockerd --validate --config-file /etc/docker/daemon.json invalid character '}' looking for beginning of object key string # エラー例2: キーのダブルクォートが抜けた場合 $ sudo dockerd --validate --config-file /etc/docker/daemon.json invalid character 'l' looking for beginning of object key string

dockerd --validate はDocker 26以降でサポートされています。出力がなければ構文に問題ありません。エラーメッセージが出た場合は、python3 -m json.tool /etc/docker/daemon.json コマンドでJSON整形確認するとエラー箇所が特定しやすくなります。

3. systemctl restart dockerで設定を反映する

構文チェックが通ったら、Dockerデーモンを再起動して設定を反映します。

# Dockerデーモンを再起動する # 注意: live-restoreなしでは稼働中コンテナが停止する $ sudo systemctl restart docker # 設定が反映されたかdocker infoで確認する $ docker info | grep -A 5 "Logging Driver" Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 2 Plugins: Volume: local # ログオプションの設定値を確認する $ docker info | grep "max-" max-file: 3, max-size: 100m

docker infoLogging Driver: json-file が表示され、ログオプションが反映されていれば設定完了です。

実務でよく使うdaemon.jsonの設定項目

1. コンテナのデフォルトログ設定(log-driver・log-opts)

本番環境では、すべてのコンテナに対してログローテーションを強制するのが鉄則です。daemon.jsonのログ設定はデフォルト値になるため、個別の docker run --log-opt 指定がないコンテナに一律で適用されます。

# /etc/docker/daemon.json(本番環境向けログ設定) { "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "5", "compress": "true" } }

max-size:1ファイルあたりの最大サイズ(k/m/g単位)。100m で100MB
max-file:ローテーション後に保持する最大ファイル数。5 で最大500MB(100MB×5)
compress:true にするとローテーション時に古いファイルをgzip圧縮する

注意点として、この設定は設定反映後に起動する新しいコンテナにのみ適用されます。既存コンテナには影響しないため、必要に応じてコンテナの再作成が必要です。

2. insecure-registriesでHTTPレジストリを許可する

社内ネットワークに構築したプライベートDockerレジストリ(HTTPS未対応・HTTP接続)へpull/pushしようとすると、デフォルトのDockerはTLSを要求するためエラーになります。insecure-registries で例外を設定します。

# /etc/docker/daemon.json(HTTPレジストリを許可する設定) { "insecure-registries": [ "192.168.10.100:5000", "registry.internal.example.com:5000" ] }

# 設定反映後、HTTPレジストリからpullできるか確認する $ docker pull 192.168.10.100:5000/myapp:latest latest: Pulling from myapp a3d5091abb3a: Pull complete Digest: sha256:8f1a3bcd... Status: Downloaded newer image for 192.168.10.100:5000/myapp:latest # docker infoで登録内容を確認する $ docker info | grep -A 3 "Insecure Registries" Insecure Registries: 192.168.10.100:5000 127.0.0.0/8

この設定はHTTP接続を許可するだけで、中間者攻撃のリスクが残ります。本番環境ではHTTPS(TLS)対応のレジストリを使うことを強く推奨します。社内ネットワーク限定の開発・CI用途に限定してください。

3. live-restoreでデーモン再起動時もコンテナを継続する

デフォルトでは、systemctl restart docker を実行すると稼働中のコンテナがすべて停止します。live-restore を有効にすると、Dockerデーモンが再起動・クラッシュしてもコンテナを停止させずに維持できます。

# /etc/docker/daemon.json(live-restore設定) { "live-restore": true }

# live-restore動作確認: コンテナ起動中にDockerをrestartする $ docker run -d --name test-nginx nginx:alpine a1b2c3d4e5f6... # Dockerデーモンを再起動する $ sudo systemctl restart docker # コンテナが継続稼働しているか確認する(STATUSがUpのまま) $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS a1b2c3d4e5f6 nginx:alpine "/docker-entrypoint.…" 5 minutes ago Up 5 minutes # live-restoreが有効か確認する $ docker info | grep "Live Restore" Live Restore Enabled: true

live-restore が有効な状態ではDocker Swarmモードとの併用はサポートされません。Swarmを使用している場合は有効にしないでください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Dockerハンズオン研修の詳細を見る >>

データ保存先をdata-rootで変更する

デフォルトではすべてのDockerデータ(イメージ・コンテナ・ボリューム)が /var/lib/docker に保存されます。ルートパーティションの容量が不足している場合や、大容量の別ディスクを活用したい場合に data-root で変更します。

1. data-rootの設定方法

# /etc/docker/daemon.json(data-root変更例) { "data-root": "/mnt/docker-data" }

2. 既存データを移行する手順

data-rootを変更する前に、既存のDockerデータを新しいパスへ移行する必要があります。

# 1. Dockerデーモンを停止する(コンテナも停止する) $ sudo systemctl stop docker # 2. 新しいディレクトリを作成する $ sudo mkdir -p /mnt/docker-data # 3. 既存データをrsyncでコピーする(-a: アーカイブモード・-H: ハードリンク保持) $ sudo rsync -aH /var/lib/docker/ /mnt/docker-data/ # 4. daemon.jsonを更新してDockerを起動する $ sudo systemctl start docker # 5. 移行後のデータ保存先を確認する $ docker info | grep "Docker Root Dir" Docker Root Dir: /mnt/docker-data # 6. 問題がなければ旧データをバックアップとして保管する $ sudo mv /var/lib/docker /var/lib/docker.bak

移行後は docker ps -adocker images で既存のコンテナ・イメージが引き続き使えることを確認してから、/var/lib/docker.bak を削除してください。

「Docker起動失敗」「設定が反映されない」時の対処法

daemon.jsonを変更した後にDockerが起動しない場合は、journalctl でエラーを確認するのが最初のステップです。

# Dockerサービスのエラーログを確認する $ sudo journalctl -xeu docker.service | tail -30 # よくあるエラー例1: JSONの末尾カンマ(trailing comma) Aug 13 12:00:01 web01.internal dockerd[1234]: invalid character '}' looking for beginning of object key string # よくあるエラー例2: 存在しないdata-rootを指定した Aug 13 12:00:01 web01.internal dockerd[1234]: failed to start daemon: Error processing daemon configuration file: mkdir /mnt/nonexistent: no such file or directory # 構文エラーの原因を特定するにはJSONフォーマッターを使う $ python3 -m json.tool /etc/docker/daemon.json Expecting ',' delimiter: line 5 column 3 (char 87)

daemon.jsonに関するトラブルの主な原因と対処をまとめます。

JSONの構文エラー:末尾カンマ・ダブルクォートの欠落が最も多い。dockerd --validatepython3 -m json.tool で事前確認する
設定が既存コンテナに反映されない:daemon.jsonの変更は新規コンテナにのみ適用される。docker inspect コンテナ名 | grep -A 5 LogConfig で個別コンテナの設定を確認する
data-rootのディレクトリが存在しない:指定パスを mkdir -p で事前に作成する
insecure-registriesが効かない:IPアドレス・ポートの記述ミスが多い。docker info | grep -A 5 "Insecure" で登録内容を確認する

本記事のまとめ

daemon.jsonで設定できる主要項目をまとめます。
設定したいこと daemon.jsonのキー
コンテナのデフォルトログサイズを制限する "log-opts": {"max-size": "100m", "max-file": "3"}
HTTPのプライベートレジストリを許可する "insecure-registries": ["HOST:PORT"]
デーモン再起動時もコンテナを維持する "live-restore": true
Dockerデータ保存先ディレクトリを変更する "data-root": "/mnt/docker-data"
設定ファイルの構文をチェックする sudo dockerd --validate --config-file /etc/docker/daemon.json
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Dockerハンズオン研修の詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。