Docker コンテナのログをクリアする

David Mbochi Njonge 2023年10月12日
  1. 新しいプロジェクトを作成する
  2. イメージを定義する
  3. イメージを構築する
  4. コンテナを実行する
  5. コンテナのログを確認する
  6. ログ ファイルでコンテナ ログを確認する
  7. echo コマンドを使用して Docker コンテナーのログをクリアする
  8. truncate コマンドを使用して Docker コンテナーのログをクリアする
  9. ログ ローテーションを使用して Docker コンテナ ログをクリアする
  10. まとめ
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 コンテンツから、コンテナから生成されたすべてのログを確認できます。これには、イベントが発生した streamtime が含まれます。 次のセクションでは、このファイルからログをクリアする方法を学習します。

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-sizemax-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 Mbochi Njonge avatar David Mbochi Njonge avatar

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