次の方法で共有


トラブルシューティング

マシンの設定またはコンテナーの実行で問題が発生しましたか? 一般的な問題を確認する PowerShell スクリプトを作成しました。 最初に試してみて、何が見つかるかを確認し、結果を共有してください。

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

一般的なソリューションと共に実行されるすべてのテストの一覧は、スクリプトの Readme ファイル にあります。

それが問題の原因を見つけるのに役立たない場合は、先に進み、スクリプトからの出力を Container Forumに投稿してください。 これは、Windows Insider や開発者を含むコミュニティから支援を受けるのに最適な場所です。

ログの検索

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

Docker コンテナー ログ

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

Log Monitor(Microsoft がサポートするオープンソース ツール) が 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 エンジンでデバッグ レベルのログ記録を有効にすることもできます。 これは、通常のログに十分な詳細がない場合のトラブルシューティングに役立ちます。

まず、管理者特権のコマンド プロンプトを開き、Docker サービスの現在のコマンド ラインを取得 sc.exe qc 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 コンピューティングの分析/デバッグ ログを有効にして、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 を提供します。