これは何?
Docker for Windows の proxy 設定について説明します
Docker の proxy 設定は二カ所必要です。一つは docker daemon の設定。もう一つは docker container の設定です。両方とも設定が必要です。
docker daemon の設定
docker pull
や docker build
などを実行する daemon が参照する proxy の設定です。
公式の Get start with Docker for windows の proxy に記載しています。
具体的に記入例は、"Proxy環境下でDocker for Windowsを使う" がわかりやすいので、そちらをご覧ください。
docker container の設定
docker run
で起動された、 docker container 上で走る OS が使う proxy の設定です。Dockerfile
中の RUN
文もこちらの設定を使います。
二通りのやり方があります。詳細は公式の Configure Docker to use a proxy server に記載がありますが、 linux 向けの記述しかありません。
また、昔の記事ではよく Dockerfile に ENV で記述する方法を紹介していますが、非推奨の方法なのでやめましょう。やめた方が良い理由は後述します。
config.json
に追記し、 docker client の設定に proxy を加える
docker コマンドの実行環境が, cmd
または powershell
と WSL2
で設定先が変わります。
cmd
または powershell
向けの設定
cmd
または powershell
の場合、config.json
は %USERPROFILE%\.docker\config.json
を参照します。
デフォルトの状態だと下記のようになっていると思います。
{
"credsStore":"desktop",
"stackOrchestrator":"swarm"
}
これに、下記のように proxy 設定を追記してください。
{
"credsStore":"desktop",
"stackOrchestrator":"swarm",
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:3001",
"httpsProxy": "http://127.0.0.1:3001",
"noProxy": "*.test.example.com,.example2.com"
}
}
}
WSL2 の場合
Linux と同様に ${HOME}/.docker/config.json
を修正します。
デフォルトの状態だと下記のようになっていると思います。
{
"credsStore": "desktop.exe"
}
これに、下記のように proxy 設定を追記してください。
{
"credsStore": "desktop.exe",
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:3001",
"httpsProxy": "http://127.0.0.1:3001",
"noProxy": "*.test.example.com,.example2.com"
}
}
}
docker container 起動時に引数で与える
docker run --env HTTP_PROXY="http://127.0.0.1:3001"
のように、--env
で指定します。
Dockerfile に ENV で記述するのはやめましょう
個人的に使用し、他の人と docker image を共有するのであれば、 ENV で指定するのは即座にやめましょう。
移植性がない
余所の環境で利用する場合、そのままの Dockerfile
では動きません。ENV の行を書き換える必要があります。もしくは、ENV に与える値を ARG 経由にするとか、 Dockerfile
側に独自の引数を追加することになります。
そのままの image を起動する場合、[上記の設定](#docker container の設定) が必要になります。 ENV に埋めるだけ無駄です。
安全性が低い
docker inspect
で docker image の情報を確認すると、 ENV の値が全て見えます。
例えば、下記の Dockerfile
で作成したものを inspect した例を示します。
FROM gliderlabs/alpine
ENV http_proxy hogehoge.jp:8080
inspect で見える、該当箇所だけ抜粋します。
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"http_proxy=hogehoge.jp:8080"
],
のような感じで、 ENV に指定した値が丸見えです。ユーザ認証を必要とする proxy だったりすると、ID や pass が漏れます。
docker build --build-arg http_proxy=... で認証プロキシを設定すると危険だよ、という話 が詳しいです。
参考にしたところ
Get started with Docker for Windows
Proxy環境下でDocker for Windowsを使う
Configure Docker to use a proxy server
docker build --build-arg http_proxy=... で認証プロキシを設定すると危険だよ、という話