Written by TSUYOSHI

dockerコンテナのログを削除する方法 【ローテート設定(ログの上限設定)も解説】

Docker PROGRAMMING SERVER

本記事では、dockerコンテナのログファイルの削除方法を解説します。

dockerを使っているサーバが動かなくなった場合は、ディスク容量の確認をしてみるとよいかもしません。dockerコンテナのログが溜まりすぎてディスク容量を圧迫している可能性があります。

僕の場合は、dockerのログが溜まりすぎて、サーバのディスク容量を実際に圧迫していました。

対処方法の概要は以下の通りです。

・ログの場所を特定する
・ログファイルの中身を削除する
・オプションでログのローテート設定をして、以後、ログが溜まりすぎないようにする

dockerコンテナのログを削除する方法


ここではまず結論のみ簡潔に解説しています。詳細な手順を知りたい方は、後半の「dockerコンテナのログを削除 & ログの上限オプション設定であるローテート設定をする方法の詳細解説」の部分からどうぞ。

ログの保存場所を確認してみます。
$ docker inspect 【コンテナ名】 | grep -i log

$ docker inspect puppeteer-chrome | grep -i log
        "LogPath": "/var/lib/docker/containers/0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da/0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da-json.log",
            "LogConfig": {

保存場所は/var/lib/docker/containers/内のさらに深いディレクトリ内で、xxxx-json.logであることがわかりました。

結論としては、ここのログを消去(ゼロにする)すれば問題は解決されます。
また再度、ログが溜まりすぎないようにログ設定のオプションを設定します。

dockerコンテナのログを削除 & ローテート設定の方法

  1. dockerのログファイルの場所を特定して、削除する。
    ※デフォルト設定では/var/lib/docker/containers/内にある

    ログの特定をするコマンド例
    $ docker inspect 【コンテナ名】 | grep -i log

    ログファイルを削除する(空にする)
    sudo truncate -s 0 /var/lib/docker/containers/xxxxx/yyyyy-json.log

  2. ロギングのオプションでローテート設定(ログの上限設定)をする

    docker-compose.ymlでの設定方法

        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "3"
  3. dockerコマンドでの設定方法

    $ docker run -d --log-opt max-size=10m --log-opt max-file=3
    $ docker start --log-opt max-size=10m --log-opt max-file=3

    dockerグローバル設定の方法

    /etc/docker/daemon.jsonを作成し、以下を追記する

    {
       "log-driver": "json-file",
       "log-opts": {"max-size": "10m", "max-file": "3"}
    }

dockerコンテナのログを削除 & ログの上限オプション設定であるローテート設定をする方法の詳細解説


ここからは、最初の調査をした内容から、細かく記載しております。

ログの確認と削除

最初、原因がわからなかったときに、問題の調査について、以下の手順で特定していきました。
※ログの削除を既にしている方は、「ログのローテート設定をする」の項目まで飛ばしてください。

dfコマンドで状況を確認しました。

$ df
ファイルシス   1K-ブロック     使用 使用可 使用% マウント位置
【中略】
/dev/vda4         46926280 45934992      0  100% /

ディスクが全部使われている…

duコマンドで容量を使いすぎているディレクトリを探します。

$ sudo du -shc /*
【中略】
38G	/var
44G	合計

$ sudo du -shc 【ディレクトリ名】で調べると、/varが44GBも容量を使っている。さらに深堀りして原因を特定します。

$ sudo du -shc /var/*
【中略】
38G	/var/lib
【中略】
38G	合計

/var/libが38GBも容量を使っている。

$ sudo du -shc /var/lib/*
【中略】
37G	/var/lib/docker
【中略】
38G	合計

/var/lib/dockerに問題があると特定。予想通り、dockerのlogが増えすぎて、サーバの容量を圧迫していることがわかりました。

sudo ls -la /var/lib/docker/containers/コマンドで、中身を確認していきます。

$ sudo ls -la /var/lib/docker/containers/
合計 24
drwx------  6 root root 4096 11月 12 11:27 .
drwx--x--x 14 root root 4096 11月 12 11:33 ..
drwx------  4 root root 4096 11月 12 11:33 0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da
drwx------  4 root root 4096 11月 12 11:33 55179efeebca663c57acc03a091fc619af2a24400708f9f8103afa4c718c0ba0
drwx------  4 root root 4096 11月 12 11:33 7845853e95dbb4515821aeb7b626e92b8b007f4d2d625bb5cfd218705bf1e016
drwx------  4 root root 4096 11月 12 11:33 a7f6379c92969b875e0ca38be85384a009c2c82ac5d8dc3b8a12ceba8e379113

ログファイルを探す

$ sudo ls -la /var/lib/docker/containers/0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da/
合計 44
drwx------ 4 root root 4096 11月 12 11:33 .
drwx------ 6 root root 4096 11月 12 11:27 ..
-rw-r----- 1 root root  622 11月  4 23:44 0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da-json.log
drwx------ 2 root root 4096 11月  4 23:32 checkpoints
-rw------- 1 root root 3433 11月 12 11:33 config.v2.json
-rw-r--r-- 1 root root 1627 11月 12 11:33 hostconfig.json
-rw-r--r-- 1 root root   13 11月  4 23:44 hostname
-rw-r--r-- 1 root root  231 11月  4 23:44 hosts
drwx------ 3 root root 4096 11月  4 23:32 mounts
-rw-r--r-- 1 root root   61 11月  4 23:44 resolv.conf
-rw-r--r-- 1 root root   71 11月  4 23:44 resolv.conf.hash

今回の場合、/var/lib/docker/containers/0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da/0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da-json.log`がログファイルと分かったので、これを消します。

ログファイルの中身を削除

sudo truncate -s 0 /var/lib/docker/containers/0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da/0142a73e296bedac7f8df13ed8ef58c52417eec66c0b946ccad5461b525740da-json.log

同様に他に、/var/lib/docker/containers/内にdockerのコンテナlogがあれば必要に応じて消していきます。

ログのローテート設定をする

【docker-compose.yml】ログの上限をオプションで設定する

僕はdocker-compose.yml で設定を書いているので、docker-compose.ymlに設定を追記して、dockerコンテナを構築し直します。

参考:dockerリファレンス デーモン設定ファイル

dockerコンテナを終了させる
docker-compose stop

docker-compose.yml にlogの上限設定を追記して、再起動する

▼docker-compose.ymlの追記例 ※logging部分を追加する

version: '3.7'

services:
  puppeteer:
    image: puppeteer-chrome-linux
    container_name: puppeteer-chrome
    【中略】
	# ▼▼▼ ここから追記 start
	# logファイルの上限をオプション設定
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
	# ▲▲▲ ここまで追記 end

max-sizemax-fileは任意で設定してください

▼loggingオプションの設定

・ログが max-size に到達すると、ロールオーバされます(別のファイルに繰り出されます)。
・設定できるサイズは、キロバイト(k)、メガバイト(m)、ギガバイト(g)
 max-size:10m のように指定します。
・もし max-size が設定されなければ、ログはロールオーバされません。

dockerコンテナを再起動します
docker-compose start

上記の手順で設定をしました。
設定は新しく作成したコンテナから適用されます。(作成済のコンテナには新しい設定は反映されないので注意)

個別の設定はこれで完了です。他の設定方法についても記載しておきます。

【dockerコマンド】ログの上限をオプションで設定する

他の方法として、以下のように、docker runコマンドのオプションとしてログの上限値を指定できるようです。

$ docker run -d --log-opt max-size=10m --log-opt max-file=3
$ docker start --log-opt max-size=10m --log-opt max-file=3

【グローバル設定】ログの上限をオプションで設定する

グローバルでもオプション設定で上限を決められるようです。
/etc/docker/daemon.json(デフォルトの場所)に設定を書き込めばOK。

dockerのデーモン設定ファイル/etc/docker/daemon.jsonが存在するか確認します。

sudo ls /etc/docker/

おそらくファイルは無いと思うので、作成し、設定を書き込みします。

sudo vi /etc/docker/daemon.json

以下の設定を書き込みます。

{
   "log-driver": "json-file",
   "log-opts": {"max-size": "10m", "max-file": "3"}
}

確認します。

$ sudo cat /etc/docker/daemon.json
{
   "log-driver": "json-file",
   "log-opts": {"max-size": "10m", "max-file": "3"}
}

dockerのコンテナをストップして、dockerのデーモンを再起動します。

$ docker-compose stop
$ systemctl restart docker
$ docker-compose start

これで反映されるかと思います。

まとめ

1. dockerのログファイルの場所を特定して、削除する。

※デフォルト設定では/var/lib/docker/containers/内にある

ログの特定をするコマンド例
$ docker inspect 【コンテナ名】 | grep -i log

ログファイルを削除する(空にする)
sudo truncate -s 0 /var/lib/docker/containers/xxxxx/yyyyy-json.log

2. ロギングのオプションでローテート設定(ログの上限設定)をする

docker-composeを使っている場合は以下を追記する(設定は任意で変える)

    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

ご参考になれば幸いです。