dockerコンテナのログを削除する方法 【ローテート設定(ログの上限設定)も解説】
本記事では、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コンテナのログを削除 & ローテート設定の方法
- dockerのログファイルの場所を特定して、削除する。
※デフォルト設定では/var/lib/docker/containers/
内にあるログの特定をするコマンド例
$ docker inspect 【コンテナ名】 | grep -i log
ログファイルを削除する(空にする)
sudo truncate -s 0 /var/lib/docker/containers/xxxxx/yyyyy-json.log
- ロギングのオプションでローテート設定(ログの上限設定)をする
docker-compose.ymlでの設定方法
logging: driver: "json-file" options: max-size: "10m" max-file: "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-size
とmax-file
は任意で設定してください
▼loggingオプションの設定
max-size
に到達すると、ロールオーバされます(別のファイルに繰り出されます)。・設定できるサイズは、キロバイト(k)、メガバイト(m)、ギガバイト(g)
max-size:10m
のように指定します。・もし
max-size
が設定されなければ、ログはロールオーバされません。・
max-file
の数までログファイルは生成され、上限を超えると順次古いものから削除されます。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"
ご参考になれば幸いです。
※当サイトでは一部のリンクについてアフィリエイトプログラムを利用して商品を紹介しています