Docker コンテナのログをクリアする
- 新しいプロジェクトを作成する
- イメージを定義する
- イメージを構築する
- コンテナを実行する
- コンテナのログを確認する
- ログ ファイルでコンテナ ログを確認する
-
echo
コマンドを使用して Docker コンテナーのログをクリアする -
truncate
コマンドを使用して Docker コンテナーのログをクリアする - ログ ローテーションを使用して Docker コンテナ ログをクリアする
- まとめ
ログは、特定のイベントまたは状態が発生したときにアプリケーションによって記録される情報であり、アプリケーションを監視して必要なアクションを実行するのに役立ちます。
たとえば、ログは、アプリケーションを本番環境にデプロイするときに、アプリケーションの状態がアップかダウンかを知るのに役立ちます。 エラーが発生した場合、ログを使用して発生したエラーの種類を特定できます。
この情報を使用して、エラーを修正するために必要な変更を加えることができます。 多くの人が使用する大規模なアプリケーションでは、ログの管理が難しい場合がありますが、Docker を使用すると、ログの操作に役立つ機能が提供されるため、ログを簡単に管理できます。
Docker は、--details
、--since
、--tail
、--timestamps
、--until
などのコマンドを提供しており、これらを利用してログを操作できます。 デフォルトでは、docker はログを JSON 形式でフォルダー /var/lib/docker/containers/
に保存しますが、作成するログを含むファイルの root
ユーザーとしてイメージを作成し、コンテナーを実行する必要があることに注意してください。 .
これがroot
ユーザー権限なしで行われると、ファイルまたはディレクトリが見つかりません
というエラーが表示されます。 このチュートリアルでは、*/*-json.log
ファイルからログを消去するために活用できるさまざまなアプローチを学習します。
新しいプロジェクトを作成する
WebStorm IDEA を開き、File > New > Project
を選択します。 開いたウィンドウで Node.js を選択し、プロジェクト名を untitled
から docker-logs-clear
に変更するか、任意の名前を使用します。
最後に、Create
というラベルの付いたボタンを押して、プロジェクトを生成します。
docker-logs-clear
フォルダーの下にファイル index.js
を作成し、次のコードをコピーしてファイルに貼り付けます。
console.log('This is an express application')
console.error('An error occurred')
throw new Error('An exception occurred')
このファイルは、アプリケーションの実行時にログ ファイルに追加される 1つの STDOUT
メッセージと 2つの STDERR
メッセージを作成します。 このコードを Web アプリケーションに変更できますが、ログ ファイルに追加されるのは STDOUT
および STDERR
メッセージのみであることに注意してください。
イメージを定義する
docker-logs-clear
フォルダーの下にファイル Dockerfile
を作成し、次の手順をコピーしてファイルに貼り付けます。
FROM node:18-alpine
WORKDIR /com/app
ADD package*.json ./
RUN npm install
ADD . .
CMD node index.js
ここで、FROM
は、後続の命令を使用してカスタム イメージを作成するベース イメージを設定します。 この場合、alpine
を使用して、Node の軽量イメージをベース イメージとして使用しました。
docker ドキュメントには、詳細な Dockerfile リファレンス が用意されており、他の手順について詳しく知ることができます。
イメージを構築する
この段階は root ユーザーとして実行する必要があることに注意してください。 これを実現するには、コンピューターのキーボード ショートカットを使用して新しいターミナル ウィンドウを開き、以下のコマンドを実行して現在のユーザーを root ユーザーに変更します。
david@david-HP-ProBook-6470b:~/WebstormProjects/docker-logs-clear$ sudo su
出力:
root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear#
イメージをビルドできるように、上記のようにディレクトリ cd
をプロジェクトの場所に変更してください。 root ユーザーにアクセスできるようになったら、次のコマンドを実行して、タグ docker-logs:latest
を使用してイメージをビルドします。
root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker build --tag docker-logs:latest .
このコマンドは Dockerfile
を実行し、以下に示すようにターミナル ウィンドウで実行中の命令を表示できます。
Step 1/6 : FROM node:18-alpine
18-alpine: Pulling from library/node
213ec9aee27d: Already exists
f379b689aea3: Pull complete
fe299d5780c0: Pull complete
c34a027bbf26: Pull complete
Digest: sha256:f829c27f4f7059609e650023586726a126db25aded0c401e836cb81ab63475ff
Status: Downloaded newer image for node:18-alpine
---> 867dce98a500
Step 2/6 : WORKDIR /com/app
---> Running in 3b215b9ad992
Removing intermediate container 3b215b9ad992
---> aba9cfa2472b
Step 3/6 : ADD package*.json ./
---> 6243ccacf178
Step 4/6 : RUN npm install
---> Running in 9b90745b171e
added 57 packages, and audited 58 packages in 9s
7 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
Removing intermediate container 9b90745b171e
---> e73c696d9743
Step 5/6 : ADD . .
---> e5235f761af0
Step 6/6 : CMD node index.js
---> Running in 7a857eea0a06
Removing intermediate container 7a857eea0a06
---> 29a367a3be2d
Successfully built 29a367a3be2d
Successfully tagged docker-logs:latest
コンテナを実行する
docker-logs
イメージを使用してコンテナーを実行するには、docker-logs-prod
という名前のコンテナーを実行する次のコマンドを実行します。 Web アプリケーションではないため、ポートは公開されていないことに注意してください。
root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker run -d --name docker-logs-prod docker-logs:latest
コンテナのログを確認する
コンテナーを実行すると、アプリケーションでコードが実行されます。 以下のコマンドを実行して、STDOUT
および STDERR
メッセージの結果としてコンテナーによって生成されたログを表示します。
root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker logs -f docker-logs-prod
出力:
This is an express application
An error occurred
/com/app/index.js:3
throw new Error("An exception occurred")
^
Error: An exception occurred
at Object.<anonymous> (/com/app/index.js:3:7)
at Module._compile (node:internal/modules/cjs/loader:1149:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1203:10)
at Module.load (node:internal/modules/cjs/loader:1027:32)
at Module._load (node:internal/modules/cjs/loader:868:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
Node.js v18.10.0
ログ ファイルでコンテナ ログを確認する
以前のログがログ ファイルに追加されたことを確認するには、次のコマンドを使用して、コンテナーが生成されたログを保存するログ ファイルの場所を確認します。
root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker inspect --format='{{.LogPath}}' docker-logs-prod
出力:
/var/lib/docker/containers/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da-json.log
ログ ファイルが作成される場所を取得したので、次のコマンドを実行して、ログ ファイルの JSON コンテンツを出力します。
root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# cat /var/lib/docker/containers/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da-json.log
出力:
{"log":"This is an express application\n","stream":"stdout","time":"2022-10-07T10:47:16.594937015Z"}
{"log":"An error occurred\n","stream":"stderr","time":"2022-10-07T10:47:16.596273395Z"}
{"log":"/com/app/index.js:3\n","stream":"stderr","time":"2022-10-07T10:47:16.617728515Z"}
{"log":"throw new Error(\"An exception occurred\")\n","stream":"stderr","time":"2022-10-07T10:47:16.61780931Z"}
{"log":"^\n","stream":"stderr","time":"2022-10-07T10:47:16.617822419Z"}
{"log":"\n","stream":"stderr","time":"2022-10-07T10:47:16.617832094Z"}
{"log":"Error: An exception occurred\n","stream":"stderr","time":"2022-10-07T10:47:16.617846368Z"}
{"log":" at Object.\u003canonymous\u003e (/com/app/index.js:3:7)\n","stream":"stderr","time":"2022-10-07T10:47:16.617855581Z"}
{"log":" at Module._compile (node:internal/modules/cjs/loader:1149:14)\n","stream":"stderr","time":"2022-10-07T10:47:16.617864838Z"}
{"log":" at Module._extensions..js (node:internal/modules/cjs/loader:1203:10)\n","stream":"stderr","time":"2022-10-07T10:47:16.617882182Z"}
{"log":" at Module.load (node:internal/modules/cjs/loader:1027:32)\n","stream":"stderr","time":"2022-10-07T10:47:16.617890043Z"}
{"log":" at Module._load (node:internal/modules/cjs/loader:868:12)\n","stream":"stderr","time":"2022-10-07T10:47:16.617898124Z"}
{"log":" at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)\n","stream":"stderr","time":"2022-10-07T10:47:16.617906808Z"}
{"log":" at node:internal/main/run_main_module:23:47\n","stream":"stderr","time":"2022-10-07T10:47:16.617914665Z"}
{"log":"\n","stream":"stderr","time":"2022-10-07T10:47:16.61792284Z"}
{"log":"Node.js v18.10.0\n","stream":"stderr","time":"2022-10-07T10:47:16.617930182Z"}
ファイルから返された JSON コンテンツから、コンテナから生成されたすべてのログを確認できます。これには、イベントが発生した stream
と time
が含まれます。 次のセクションでは、このファイルからログをクリアする方法を学習します。
echo
コマンドを使用して Docker コンテナーのログをクリアする
ログ ファイルから JSON コンテンツを消去するには、echo
コマンドを使用してファイルを空の文字列で上書きする次のコマンドを実行します。
root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# echo "" > $(docker inspect --format='{{.LogPath}}' docker-logs-prod)
ログ ファイルがクリアされたことを確認するには、docker logs -f docker-logs-prod
コマンドを実行します。ファイルからログが返されないことに注意してください。
truncate
コマンドを使用して Docker コンテナーのログをクリアする
以前のコンテナを再実行してログを再度生成し、次のコマンドを実行してログ ファイルに追加されたログをクリアします。 これは、truncate
コマンドを使用して、ファイルをサイズ 0
に縮小します。
root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# truncate -s 0 $(docker inspect --format='{{.LogPath}}' docker-logs-prod)
ログ ファイルがクリアされたことを確認するには、docker logs -f docker-logs-prod
コマンドを実行します。ファイルからログが返されないことに注意してください。
ログ ローテーションを使用して Docker コンテナ ログをクリアする
前の 2つの例では、echo
コマンドと truncate
コマンドを使用して、ログ ファイルの内容を手動でクリアしました。 これらのアプローチは、docker ロギング システムに影響を与え、予期しない動作を引き起こす可能性があるため、お勧めしません。
コンテナーからログをクリアするための推奨される方法は、ログ ローテーションを使用することです。 デフォルトのロギング ドライバー json-file
でログ ローテーションを使用するには、/etc/docker の下にある
daemon.jsonという名前のファイルで、ログ ファイルの
max-sizeと
max-fileを設定できます。 /
フォルダー。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
これは、root
ユーザー権限で行う必要があります。 変更を有効にするには、コマンド systemctl reload docker
を使用して docker をリロードする必要があります。
個々のコンテナのログローテーションを指定したい場合、コンテナを実行する際に--log-driver json-file
、--log-opt max-size=10m
、および--log-opt max-file=3
オプションを指定できます。
まとめ
このチュートリアルでは、ログ ファイルに追加された JSON コンテンツをクリアすることで、docker コンテナーからログをクリアするために使用できるさまざまなアプローチを学習しました。 このチュートリアルで取り上げたアプローチには、echo
コマンド、truncate
コマンド、および log-rotation
の使用が含まれます。
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub