Fiddler で Docker Daemon の通信ログを取得する

掲載内容は個人の見解であり、所属する企業を代表するものではありません.


はじめに

Azure Container Registry を使用する際のデータエンドポイント周りの通信ログを取りたかったので、 Fiddler を Proxy にしてやれば取れるだろと思ったら微妙に設定ではまったのでここに記録します。

前提条件

私が試して成功した環境は以下になります。つかってるツールや環境が異なると動かないかもしれないので。 この記事執筆時点(2021-03-17)での最新だと思います。

Fiddler のセットアップ

まずは Fiddler のインストールです。 公式サイト からインストーラをダウンロード、アカウントを作成、Fiddler を起動すると、 システムプロキシが以下のように設定されます。

browser-proxy-settings-for-fiddler

Fiddler は 127.0.0.1:8866 で待ち受けるプロキシサーバーとして動作していることが分かります。 Docker Daemon が勝手にこれを使ってくれればいいんですが、そうは行かないので Docker Daemon の方に設定してやります。 またこの設定そのままにしておくとシステムプロキシを利用するアプリケーション、主に Web ブラウザの通信ログが全部とれて邪魔なので、 不要な方はここでオフにしておくことをお勧めします。

Docker Daemon のセットアップ

タスクバーに入っているクジラ(Moby Dock っていう名前なんですね)のアイコンを右クリックして設定画面を開きます。

docker-proxy-failure-setup

この図のように 127.0.0.1:8866 を設定してやるだけかと思いきや、実はそうは行かなくて Docker Daemon が Proxy に接続を拒否されてしまいます。

PS > docker pull hello-world

Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: dial tcp 127.0.0.1:8866: connect: connection refused

うーん、困りました。 いろいろ調べた結果 host.docker.internal というコンテナからホストを解決するための DNS があるらしく、これを試したらうまく行きました。 Docker for Windows のドキュメント には コンテナーからホスト上のサービスに接続 との記述になっていますが、Docker Daemon もこれを使うってことなのかしら。 よって以下のような設定になります。

docker-proxy-setup-setup

この状況で先ほどと同じコマンドを実行すると無事に通信が通ります。

PS > docker pull hello-world

Using default tag: latest
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Fiddler 側で取れたキャプチャがこちらになります。 いろいろと通信してるんですね(当たり前か)

docker-communication-log

補足

上記の設定はあくまでも Docker Daemon が通信する時にホスト上で動作する Proxy 設定の方法なので、 コンテナーで動作するアプリケーションが動作する時の通信ログを Fiddler で取るためには別の設定が必要なはずです。 こっちは必要ないので試していないのですが、 実行時に環境変数で設定するか、Docker クライアントの設定ファイルを記述 すれば良さそうですね。