Docker で HTTP / HTTPS プロキシを使う方法
Docker で HTTP / HTTPS プロキシを使う方法のまとめです。
といっても、 Docker 自体がプロキシ用の設定項目を提供しているので単純にそれを利用すれば OK です。 公式ドキュメントの次のページなどで説明されています。
- HTTP/HTTPS proxy | Control Docker with systemd | Docker Documentation
- Configure Docker to use a proxy server | Docker Documentation
動作確認時のバージョン
macOS:
❯ sw_vers
ProductName: macOS
ProductVersion: 12.6
BuildVersion: 21G115
docker
:
❯ docker --version
Docker version 20.10.17, build 100c701
docker compose
:
❯ docker compose version
Docker Compose version v2.10.2
Docker で HTTP / HTTPS プロキシを使う方法
上述のとおり Docker 自体がプロキシの設定方法を提供しているので、コンテナ内のアプリケーションでプロキシを意識して使う必要はありません。
いくつかの方法が用意されています。
- A) Docker daemon で設定する
- B) Docker client で設定する
- C) 環境変数で設定する
グローバルに共通の設定を使いたいなら A) か B) 、コンテナ単位で異なる設定を使いたいなら C) 、と使い分けるとよいかと思います。
ちなみに、 B) と C) の関係について公式ドキュメントには「 C) の方法が先に用意されて、後から B) の方法が追加された」と説明されています。 B) は 2017 年リリースの Docker 17.07 から使えるようになりました。
A) Docker daemon で設定する
Docker daemon のレイヤーで設定する方法です。
Linux の場合
設定ファイル /etc/systemd/system/docker.service.d/http-proxy.conf
に環境変数を記述します(ファイルが無ければ作成します)。
/etc/systemd/system/docker.service.d/http-proxy.conf
:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
変数の意味合いは次のとおりです:
変数 | 意味合い |
---|---|
HTTP_PROXY |
HTTP で利用するプロキシ |
HTTPS_PROXY |
HTTPS で利用するプロキシ |
NO_PROXY |
プロキシから除外するホスト・ドメインの一覧( , 区切り) |
初回設定後・変更後は daemon の再起動が必要です:
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker for Mac / Windows の場合
GUI の Preferences → Proxies → Manual proxy configuration で設定できます。
「 Manual proxy configuration 」を有効にして以下 3 つを設定します:
- Web Server (HTTP)
- Secure Web Server (HTTPS)
- Bypass proxy settings for these hosts & domains
上から HTTP_PROXY
HTTPS_PROXY
NO_PROXY
に相当するようです。
しかし、私が Docker for Mac で確認したところ、 HTTP_PROXY
と HTTPS_PROXY
は期待したとおりに効きますが NO_PROXY
は設定しても効果がありませんでした。
どうも記事執筆時点でバグがあるようです:
- Docker seems to ignore no_proxy settings · Issue #2723 · docker/for-mac · GitHub
- NO_PROXY / no_proxy appears to be ignored when pulling images · Issue #5844 · docker/for-mac · GitHub
B) Docker client で設定する
Docker client のレイヤーで設定する方法です。
A) と同様に設定ファイルで設定します。
使うべき設定ファイルはコンテナを起動するユーザーのホームディレクトリ以下の ~/.docker/config.json
です。
~/.docker/config.json
:
{
"proxies":
{
"default":
{
"httpProxy": "http://192.168.1.12:3128",
"httpsProxy": "http://192.168.1.12:3128",
"noProxy": "*.test.example.com,.example2.com,127.0.0.0/8"
}
}
}
httpProxy
httpsProxy
noProxy
の意味合いは A) の場合と同様です:
変数 | 意味合い |
---|---|
httpProxy |
HTTP で利用するプロキシ |
httpsProxy |
HTTPS で利用するプロキシ |
noProxy |
プロキシから除外するホスト・ドメインの一覧( , 区切り) |
C) 環境変数で設定する
コンテナの環境変数で設定する方法です。
A) と同様、以下の変数が使えます。
HTTP_PROXY
HTTPS_PROXY
NO_PROXY
たとえば、コマンド docker run
の場合はオプション --env
-e
で指定します:
docker run \
-e HTTP_PROXY=http://192.168.1.12:3128 \
-e HTTPS_PROXY=http://192.168.1.12:3128 \
-e NO_PROXY="*.test.example.com,.example2.com" \
myimage
Docker Compose の場合は environment
で指定します:
version: "3"
services:
app:
build: ./services/app
environment:
HTTP_PROXY: "http://192.168.1.12:3128"
HTTPS_PROXY: "http://192.168.1.12:3128"
NO_PROXY: "*.test.example.com,.example2.com"
次のように、 Docker コンテナ内からホストのポートにアクセスする方法まとめ のホストのポートを使う方法と組み合わせれば、ホストマシンで動いているプロキシサーバーを使うこともできます:
version: "3"
services:
app:
build: ./services/app
# ホストのポート 8899 で動いているプロキシサーバーを使う
environment:
HTTP_PROXY: "host.docker.internal:8899"
HTTPS_PROXY: "host.docker.internal:8899"
extra_hosts:
- "host.docker.internal:host-gateway"
サンプル
動かして試せるサンプルを GitHub に置きました。
参考
Docker 公式ドキュメント:
- HTTP/HTTPS proxy | Control Docker with systemd | Docker Documentation
- Configure Docker to use a proxy server | Docker Documentation
- Proxies | Change Docker Desktop settings on Linux | Docker Documentation
- Proxies | Change Docker Desktop preferences on Mac | Docker Documentation
- Proxies | Change Docker Desktop settings on Windows | Docker Documentation
その他: