トラブルシューティング

コンピューターのセットアップやコンテナーの実行で問題が発生したときのために、 一般的な問題を検出する PowerShell スクリプトを用意しました。 最初にこのスクリプトを実行して、結果を調べてみてください。

Invoke-WebRequest https://aka.ms/Debug-ContainerHost.ps1 -UseBasicParsing | Invoke-Expression

このスクリプトで実行されるすべてのテストの一覧と一般的な解決策が、スクリプトの Readme ファイルに記載されています。

問題の原因を特定できない場合は、スクリプトの出力をコンテナー フォーラムで投稿してください。 Windows Insider 参加者や開発者も集まるこのコミュニティは、手助けを求めるには最適の場所です。

ログを見つける

Windows コンテナーの管理に使用される複数のサービスがあります。 次の各セクションで、ログの場所をサービス別に示します。

Docker コンテナー ログ

コマンドは docker logs 、Linux アプリケーションの標準的なアプリケーション ログデポジットの場所である STDOUT/STDERR からコンテナーのログをフェッチします。 通常、Windows アプリケーションは STDOUT/STDERR にログを記録しません。代わりに、ETW、イベント ログ、またはログ ファイルなどにログを記録します。

Microsoft がサポートするオープンソース ツールである Log Monitor が github で利用できるようになりました。 ログ モニターは、Windows アプリケーション ログを STDOUT/STDERR にブリッジします。 ログ モニターは、構成ファイルを使用して構成されます。

ログ モニターの使用状況

LogMonitor.exeと LogMonitorConfig.json の両方を同じ LogMonitor ディレクトリに含める必要があります。

ログ モニターは、SHELL の使用パターンで使用できます。

SHELL ["C:\\LogMonitor\\LogMonitor.exe", "cmd", "/S", "/C"]
CMD c:\windows\system32\ping.exe -n 20 localhost

または ENTRYPOINT の使用パターン:

ENTRYPOINT C:\LogMonitor\LogMonitor.exe c:\windows\system32\ping.exe -n 20 localhost

どちらの使用例も、ping.exe アプリケーションをラップします。 その他のアプリケーション ( IIS など)。ServiceMonitor) は、同様の方法でログ モニターと入れ子にすることができます。

COPY LogMonitor.exe LogMonitorConfig.json C:\LogMonitor\
WORKDIR /LogMonitor
SHELL ["C:\\LogMonitor\\LogMonitor.exe", "powershell.exe"]

# Start IIS Remote Management and monitor IIS
ENTRYPOINT      Start-Service WMSVC; `
                    C:\ServiceMonitor.exe w3svc;

ログ モニターは、ラップされたアプリケーションを子プロセスとして起動し、アプリケーションの STDOUT 出力を監視します。

SHELL 使用パターンでは、CMD/ENTRYPOINT 命令は EXEC 形式ではなく SHELL 形式で指定する必要があることに注意してください。 CMD/ENTRYPOINT 命令の exec 形式を使用すると、SHELL は起動されず、ログ モニター ツールはコンテナー内で起動されません。

詳細については、「 ログ モニター」Wiki を参照してください。 主要な Windows コンテナー シナリオ (IIS など) の構成ファイルの例は、 github リポジトリにあります。 追加のコンテキストについては、こちらの ブログ記事を参照してください。

Docker エンジン

Docker エンジンは、ファイルではなく Windows 'アプリケーション' イベント ログに記録します。 これらのログは、Windows PowerShell を使用することで、簡単に読み取り、並べ替え、およびフィルター処理することができます。

たとえば、過去 5 分間の Docker エンジン ログを古い順に表示できます。

Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-5) | Sort-Object Time

また、別のツールで読み取り可能な CSV ファイル、またはスプレッドシートに簡単にパイプすることができます。

Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-30)  | Sort-Object Time | Export-CSV ~/last30minutes.CSV

デバッグ ログを有効にする

Docker エンジンのデバッグ レベルのログ出力を有効にすることもできます。 これは、トラブルシューティングに必要な詳細情報が通常のログでは得られない場合に役立つ可能性があります。

管理者特権でのコマンド プロンプトを開いてから、sc.exe qc docker を実行して Docker サービスの現在のコマンド ラインを取得します。 例:

C:\> sc.exe qc docker
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: docker
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "C:\Program Files\Docker\dockerd.exe" --run-service
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Docker Engine
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

現在の BINARY_PATH_NAME を次のとおりに変更します。

  • 末尾に -D を追加する
  • " をそれぞれ \ でエスケープする
  • コマンド全体を " で囲む

変更したら、sc.exe config docker binpath= の後に変更後の文字列を付けて実行します。 例:

sc.exe config docker binpath= "\"C:\Program Files\Docker\dockerd.exe\" --run-service -D"

次に、Docker サービスを再起動します。

sc.exe stop docker
sc.exe start docker

このようにすると、大量のログがアプリケーション イベント ログに出力されるため、トラブルシューティングが完了したら -D オプションを削除することをお勧めします。 上記の同じ手順を、-D を付けずに実行してからサービスを再起動すると、デバッグ ログは出力されなくなります。

上記の手順の代わりに、管理者特権の PowerShell プロンプトからデバッグ モードで docker デーモンを実行して、ファイルに直接出力をキャプチャすることもできます。

sc.exe stop docker
<path\to\>dockerd.exe -D > daemon.log 2>&1

スタック ダンプの取得

一般に、これは、Microsoft サポートまたは Docker 開発者から明示的に要求された場合にのみ役立ちます。 これは、Docker がハングしているように見える状況の診断に使用できます。

docker signal.exe をダウンロードします。

用途:

docker-signal --pid=$((Get-Process dockerd).Id)

出力ファイルは、docker が実行されているデータ ルート ディレクトリにあります。 既定のディレクトリは C:\ProgramData\Docker です。 実際のディレクトリは、docker info -f "{{.DockerRootDir}}" を実行することによって確認できます。

ファイルは になります goroutine-stacks-<timestamp>.log

個人情報が含まれていないことに goroutine-stacks*.log 注意してください。

ホスト コンピューティング サービス

Docker エンジンは、Windows 固有のホスト コンピューティング サービスに依存します。 このサービスには、次のような独立したログがあります。

  • Microsoft-Windows-Hyper-V-Compute-Admin
  • Microsoft-Windows-Hyper-V-Compute-Operational

これらはイベント ビューアーに表示され、PowerShell を使用してクエリを実行することもできます。

例:

Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Admin
Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Operational

HCS 分析/デバッグ ログをキャプチャする

Hyper-V Compute の分析/デバッグ ログを有効にし、hcslog.evtx に保存します。

# Enable the analytic logs
wevtutil.exe sl Microsoft-Windows-Hyper-V-Compute-Analytic /e:true /q:true

# <reproduce your issue>

# Export to an evtx
wevtutil.exe epl Microsoft-Windows-Hyper-V-Compute-Analytic <hcslog.evtx>

# Disable
wevtutil.exe sl Microsoft-Windows-Hyper-V-Compute-Analytic /e:false /q:true

HCS 詳細トレースをキャプチャする

一般的に、これらが使用されるのは、Microsoft サポートによって要求された場合のみです。

HcsTraceProfile.wprp をダウンロードします。

# Enable tracing
wpr.exe -start HcsTraceProfile.wprp!HcsArgon -filemode

# <reproduce your issue>

# Capture to HcsTrace.etl
wpr.exe -stop HcsTrace.etl "some description"

HcsTrace.etl をサポート担当者に提供します。