Docker で HTTP / HTTPS プロキシを使う方法

Docker

Docker で HTTP / HTTPS プロキシを使う方法のまとめです。

といっても、 Docker 自体がプロキシ用の設定項目を提供しているので単純にそれを利用すれば OK です。 公式ドキュメントの次のページなどで説明されています。

動作確認時のバージョン

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 で設定できます。

Docker for Mac の Proxies 設定

「 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_PROXYHTTPS_PROXY は期待したとおりに効きますが NO_PROXY は設定しても効果がありませんでした。 どうも記事執筆時点でバグがあるようです:

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 公式ドキュメント:

その他:


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら