プロキシ環境でどうしてもDocker Engineのコンテナが立ち上がらない

プロキシ環境だとどうしてもdocker-compose up -ddocker compose buildなどのコマンドが通らないことがある。コンテナ再構築のためにdocker-compose build --no-cache コンテナ名を改めて叩いたらエラーになるなんてこともある。

※Docker EngineとはコマンドラインでUbuntu(Linux)などにインストールするDockerのことで、MacやWindowsにGUIからインストールするソフトとは異なる

root@yaju-PRIMERGY-TX1310-M3:~/crm_private# docker-compose build --no-cache app
[+] Building 2.8s (4/4) FINISHED
 => [internal] load .dockerignore                                          0.6s
 => => transferring context: 2B                                            0.0s
 => [internal] load build definition from Dockerfile                       0.4s
 => => transferring dockerfile: 693B                                       0.1s
 => CANCELED [internal] load metadata for docker.io/library/composer:2.0   2.1s
 => ERROR [internal] load metadata for docker.io/library/php:8.0-fpm-bust  2.1s
------
 > [internal] load metadata for docker.io/library/php:8.0-fpm-buster:
-----
failed to solve: DeadlineExceeded: DeadlineExceeded: php:8.0-fpm-buster: failed to do request: Head "https://registry-1.docker.io/v2/library/php/manifests/8.0-fpm-buster": proxyconnect tcp: dial tcp x.x.x.x:8080: i/o timeout

docker.ioからcomposeやphpをpullする処理が止まってLaravelのインストールが中断されている??

http-proxy.confの編集

/etc/systemd/system/docker.service.d/http-proxy.conf

に下記のように編集

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080" "HTTPS_PROXY=http://proxy.example.com:8080" "NO_PROXY=localhost,127.0.0.1"

proxy.example.com:8080は自分の環境のプロキシサーバーの置き換える。

ポイントは、2行目のEnvironment=の行は改行せずにまとめて書くこと!!

自分はここを改行していたせいで通らなかった。
↓ダメな例

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,.local"

上記のファイルやディレクトリは元々はないと思われるので、ええ感じに作るべし。

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf

ファイルを編集したら

sudo systemctl daemon-reload
sudo systemctl restart docker

を叩いて反映させてね。

そしたらdocker compose buildなり、docker compose -builddocker-compose up -ddocker compose up -d などのコマンドが通るようになるはず!

環境変数の設定

export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080
export no_proxy=localhost,127.0.0.1

を叩く。

同じく上記は自分の環境のプロキシに置き換えてね。

ほんで、

sudo systemctl daemon-reload
sudo systemctl restart docker

を叩いて反映させてね。

さらに設定が必要なことが発覚

このままだとサーバー再起動時などに設定がリセットされてしまう。

  1. ターミナルを開き、*vim ~/.bashrcと入力します。これにより、テキストエディタvimが起動し、.bashrcファイルを開きます。
  2. .bashrcファイルの末尾に以下の行を追加します(実際のプロキシサーバーとポートに置き換えてください):
export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080
export no_proxy=localhost,127.0.0.1

daemon.jsonの設定

/etc/docker/daemon.json

{
  "proxies": {
    "http-proxy": "http://proxy.example.com:8080",
    "https-proxy": "http://proxy.example.com:8080",
    "no-proxy": "localhost,127.0.0.1"
  }
}

なんか自分の環境ではDNSの値が元々設定されてたけど消していい。

このファイル自体がなければ作ったらいいと思う。

編集後に、

sudo systemctl restart docker

を実行して反映させる。

また、このディレクトリにはこれ以外にjsonファイルを置かないほうがいい。

もし編集前にバックアップしたければ、daemon.bak

など、json以外の拡張子にすべし。

In Docker Engine version 23.0 and later versions, you may also configure proxy behavior for the daemon in the [daemon.json file](https://docs.docker.com/config/daemon/#configure-the-docker-daemon):

{ "proxies": { "http-proxy": "http://proxy.example.com:3128", "https-proxy": "https://proxy.example.com:3129", "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8" } }

These configurations override the default docker.service systemd file.

If you are behind an HTTP or HTTPS proxy server, for example in corporate settings, the daemon proxy configurations must be specified in the systemd service file, not in the daemon.json file or using environment variables.

Configure the daemon with systemd

ChatGPT(GPT4)に聞いても、DockerDesktopのdaemon.jsonの書き方(微妙に記述が違いエラーになる)ばっかり解説してきてウザかった。

ちゃんと公式ドキュメント見ないとあかんな。

aptのプロキシ設定

プロキシ環境下でapt updateやapt-get updateが通らない

上記の記事の設定でうまくいくこともあるが、そうじゃない場合もある。

試す価値はあるかも。

それでもうまくいかない時の荒技

=> ERROR [stage-0 3/5] RUN apt-get update &&     apt-get -y install git  31.8s
------
 > [stage-0 3/5] RUN apt-get update &&     apt-get -y install git unzip libzip-dev libicu-dev libonig-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev &&     apt-get clean &&     apt-get install nkf &&     rm -rf /var/lib/apt/lists/* &&     docker-php-ext-configure gd --with-freetype --with-jpeg &&     docker-php-ext-install -j$(nproc) gd &&     docker-php-ext-install intl pdo_mysql zip bcmath:
#0 0.935 + apt-get update
#0 31.23 Err:1 http://deb.debian.org/debian buster InRelease
#0 31.23   Could not connect to 謎のプロキシ:8080 (謎のプロキシ), connection timed out
#0 31.23 Err:2 http://deb.debian.org/debian-security buster/updates InRelease
#0 31.23   Unable to connect to 謎のプロキシ:8080:
#0 31.23 Err:3 http://deb.debian.org/debian buster-updates InRelease
#0 31.23   Unable to connect to 謎のプロキシ:8080:
#0 31.23 Reading package lists...
#0 31.24 W: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease  Could not connect to 謎のプロキシ:8080 (謎のプロキシ), connection timed out
#0 31.24 W: Failed to fetch http://deb.debian.org/debian-security/dists/buster/updates/InRelease  Unable to connect to 謎のプロキシ:8080:
#0 31.24 W: Failed to fetch http://deb.debian.org/debian/dists/buster-updates/InRelease  Unable to connect to 謎のプロキシ:8080:
#0 31.24 W: Some index files failed to download. They have been ignored, or old ones used instead.

なんか設定した覚えのないプロキシサーバーに接続しようとして失敗し続けることがある。

ほんまになんでかわからん。

思い当たる設定ファイルと環境変数は全部見たけどわからんかった。

上記の例ではDockerfileに記載されたapt-getコマンド実行時にそのエラーが起きている。

そんな時は、apt-getの指示を記載しているDockerfileにプロキシをコマンドから受け取れるような設定を追記する必要がある。

Dockerfileを編集したからといって、プロキシの指定が必要ない環境や設定済みのプロキシがすでにある正常な環境で動かなくなるわけじゃないから安心して。

Dockerfileの編集

Dockerfileの2行目からこのような記述を書いた。

# ここにプロキシの引数を追加
ARG HTTP_PROXY=""
ARG HTTPS_PROXY=""

# 環境変数としてプロキシを設定
ENV http_proxy=$HTTP_PROXY
ENV https_proxy=$HTTPS_PROXY
ENV COMPOSER_ALLOW_SUPERUSER=1 \
    COMPOSER_HOME=/composer

自分の環境だとファイル全体はこうなった。

infra/php/Dockerfile

FROM php:8.0-fpm-buster

# ここにプロキシの引数を追加
ARG HTTP_PROXY=""
ARG HTTPS_PROXY=""

# 環境変数としてプロキシを設定
ENV http_proxy=$HTTP_PROXY
ENV https_proxy=$HTTPS_PROXY
ENV COMPOSER_ALLOW_SUPERUSER=1 \
    COMPOSER_HOME=/composer

SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer

RUN apt-get update && \
    apt-get -y install git unzip libzip-dev libicu-dev libonig-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \
    apt-get clean && \
    apt-get install nkf && \
    rm -rf /var/lib/apt/lists/* && \
    docker-php-ext-configure gd --with-freetype --with-jpeg && \
    docker-php-ext-install -j$(nproc) gd && \
    docker-php-ext-install intl pdo_mysql zip bcmath

COPY ./php.ini /usr/local/etc/php/php.ini

WORKDIR /work

プロキシを指定してコマンドを実行

http_proxy=http://http://proxy.example.com:8080/ https_proxy=http://http://proxy.example.com:8080/  docker-compose build --no-cache --build-arg HTTP_PROXY=http://http://proxy.example.com:8080 --build-arg HTTPS_PROXY=http://http://proxy.example.com:8080 --build-arg NO_PROXY=localhost,127.0.0.1 コンテナ名

proxy.example.com:8080は自分の環境のプロキシサーバーの置き換える。
コンテナ名は別に未入力でもいい。

これでインストールに成功した。

その後、docker-compose up -dしたら正常にコンテナも立ち上がった。

ちなみに、docker-compose build --no-cache コンテナ名のようにプロキシサーバーを明示的に指定しない普通のコマンドを叩けば、今まで通りプロキシなしの環境でも、または正しくプロキシが設定されている環境でも問題なくこのコンテナは動くよ。だから、特定の環境専用のDockerfileになっているわけじゃないから安心してほしい。

環境

ubuntu desktop 20.04.2

docker23.0.0.1

ビッグローブ光

爆速プロバイダー

  • 速度が速い
  • IPv6オプション無料
  • キャッシュバックあり
  • 工事までそんなに時間かからないことが多い(自分の場合1、2週間ほどで来てくれた)
  • ケータイがauなら毎月割引がある
  • 速度が速い

 

 

自分の環境だと、上記のBIGLOBE光で爆速。

このサイトで速度を計測すると

https://fast.com/ja/

驚異の930Mbps

 

はやw

もちろんこれは理論値ではなくて実測値。

車の燃費で言うカタログスペックではなく、実際の燃費みたいなかんじ。

ここまで速いと、正直これ以上速くなっても体感上はわからない。

みんなも

https://fast.com/ja/

で速度を計ってみてほしい。

おすすめの記事