コンテナーまたはサービスのログ確認

docker logsは実行中のコンテナーが出力するログ情報を確認するコマンドです。 docker service logsコマンドは、1 つのサービスに参加しているコンテナーすべてのログ情報を確認します。 出力されるログ情報およびその出力書式は、ほぼコンテナーのエンドポイントコマンドにより定まります。

デフォルトにおいてdocker logsdocker service logsは、端末画面にて対話的にコマンドを入力した際、そのコマンドが出力するものと同じような情報を得ることができます。 UNIX や Linux コマンドは普通、3 つの I/O ストリームを実行時に開きます。 それはSTDINSTDOUTSTDERRです。 STDINはコマンドの入力ストリームです。 これはキーボードから入力されるか、あるいは他のコマンドからの入力の場合もあります。 STDOUTはコマンドの標準出力です。 そしてSTDERRは通常、エラーメッセージを出力するために用いられます。 デフォルトでdocker logsは、コマンドのSTDOUTSTDERRを表示します。 I/O と Linux に関しての詳細は Linux Documentation Project における I/O リダイレクション を参照してください。

docker logsの出力だけでは不十分なことがあります。 その場合は別の手順が必要になります。

  • ログドライバー を利用するにあたって、そのドライバーのログ出力先が、ファイル、外部ホスト、データベース、別のログバックエンドであって、“デュアルログ” が無効になっている場合、docker logsの出力は不十分なものになる場合があります。
  • 実行するイメージが、ウェブサーバーやデータベースのような非対話的なプロセスである場合、ログはSTDOUTSTDERRにではなく、ログファイルに対して出力されるかもしれません。

上の 1 点めに該当する場合、ログ出力が他の方法で処理されているため、docker logsは利用しないようにすることが考えられます。 2 点めの場合、nginxの公式イメージではその解決がなされていて、公式の Apache イメージhttpdでは、また別の解決方法をとっています。

nginxの公式イメージでは、/var/log/nginx/access.logから/dev/stdoutへのシンボリックリンクを生成しています。 同じく/var/log/nginx/error.log/dev/stderrへのリンクとしています。 ログファイルをこのように設定し、ログ内容に合わせた特別デバイスへの出力を行っています。 詳しくは Dockerfile を参照してください。

公式イメージhttpdでは、httpdアプリケーション設定を変更して、標準出力を直接/proc/self/fd/1(すなわちSTDOUT)に、またエラーを/proc/self/fd/2(すなわちSTDERR)にそれぞれ出力するようにしています。 詳しくは Dockerfile を参照してください。

次のステップ

docker, logging