概要
Dockerホストがインターネットに直接接続できない環境で、プロキシサーバー経由でのアクセスが必要な場合、docker pullコマンドによるイメージ取得は失敗します。本記事では、Dockerデーモンがプロキシ経由で外部リポジトリからイメージを正常に取得できるようにする設定手順を説明します。この設定はDockerデーモン自身が外部ネットワークにアクセスする際のプロキシ設定であり、コンテナ内部からのネットワークアクセス設定とは異なる点に注意が必要です。
発生事象
プロキシ未設定の状態でイメージを取得しようとすると、以下のようなタイムアウトエラーが発生します。
# docker pull nginx
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/":
net/http: request canceled while waiting for connection
(Client.Timeout exceeded while awaiting headers)
動作環境
- ホストOS: Ubuntu 22.04 LTS
- Dockerバージョン: 24.0.5
設定手順
1. systemdのオーバーライド設定ファイルを作成
Dockerサービスのsystemdユニットに対して、プロキシ設定をオーバーライドする設定ファイルを作成します。
# mkdir -p /etc/systemd/system/docker.service.d
# nano /etc/systemd/system/docker.service.d/proxy.conf
作成したファイルに以下の内容を追記します。プロキシサーバーのアドレスとポートは、ご自身の環境に合わせて修正してください。
[Service]
Environment="HTTP_PROXY=http://proxy.internal.company:8080"
Environment="HTTPS_PROXY=http://proxy.internal.company:8080"
Environment="NO_PROXY=localhost,127.0.0.1,localregistry.corp,.example.com"
NO_PROXYパラメータには、プライベートネットワーク内のDockerレジストリやローカルホストなど、プロキシを経由させないアクセス先をカンマ区切りで指定します。これにより、内部リソースへのアクセスが効率化され、意図しないトラフィックがプロキシサーバーを通過するのを防ぎます。
2. Dockerサービスの再起動
設定を反映させるため、systemdの設定を再読み込みし、Dockerサービスを再起動します。
# systemctl daemon-reload
# systemctl restart docker
3. 動作確認
設定が正しく反映されているか、外部からイメージを取得して確認します。
# docker pull alpine:latest
latest: Pulling from library/alpine
540fe6071b1c: Pull complete
Digest: sha256:8564a35e1c233d6c75a8d41e5f236d3b0e9e823535f6b8d45c5d53d6e6a5a0a
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
イメージが正常にダウンロードできれば、プロキシ設定は成功です。設定後はdocker infoコマンドを実行し、出力にプロキシ設定が含まれていることを確認することも推奨されます。
なお、この設定はDockerデーモンが外部リポジトリと通信する際に適用されます。コンテナ内のプロセスが外部にアクセスする際のプロキシ設定は、コンテナ実行時に環境変数として渡す必要があります。