初心者でもDockerのproxyエラーを解決する!

初心者でもDockerのproxyエラーを解決する! Docker

Docker界隈ではproxy設定でお困りの方が本当にたくさんいるようで、「docker proxy」で検索すると様々なレベル感の記事が無数にヒットします。

こちらの記事では初心者エンジニアの人向けてわかりやすくproxy設定方法を紹介していきます。私も初心者なので細かい説明はできません!

Dockerで必要なProxyの設定は2種類ある!

まず重要な点は、Docker Hubからイメージをpullするとき等に使うDocker daemon用のproxy設定とコンテナ作成、起動時に必要なproxy設定を別で行う必要があることです。

「proxy設定したはずなのにまたproxyでエラー?」というときは片方しか設定できていないケースだと思います。以下ではそれぞれのproxy設定方法を記載していきます。

Docker daemon用のproxy設定方法

公式ドキュメントにdaemon用proxy設定についてもしっかり記載されているのですが、ウェブ検索してもこのサイトにたどり着けません。そしてたどり着いてもproxy設定の説明が始まる前までに専門用語が飛び交うためブラウザバックしてしまう人もいる気がします。

やることは公式の通りに/etc/systemd/system/docker.service.dディレクトリに、[Service]以下に自身のproxy設定を記載したhttp-proxy.confファイルを作成するだけです。以下に必要なコマンドを全部まとめます。proxy serverとportは自分の環境に応じて設定してください。

$ sudo mkdir /etc/systemd/system/docker.service.d
$ cd /etc/systemd/system/docker.service.d
$ sudo echo "[Service]" >> http-proxy.conf
$ sudo echo 'Environment="HTTP_PROXY=http:<proxyサーバー>:<port番号>" "HTTPS_PROXY=http:<proxyサーバー>:<port番号>"' >> http-proxy.conf
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

正しく設定できているか確認します。

$ docker info
....
....
HTTP_PROXY: <proxyサーバー>:<port番号>
HTTPS_PROXY: <proxyサーバー>:<port番号>
....
....

出力に上記のproxyの内容が含まれていれば設定成功です!

最後に以下のコマンドでhello worldイメージをpullできるか確認します。このコマンドがエラーなく実行できればdaemonのproxy設定は完了です。

$ docker pull hello-world

一部の記事では/etc/systemd/system直下にdocker.serviceファイルを作成してproxy情報を記入すると紹介されていましたが、私がこの方法を試すとdockerが起動しなくなりました。

ちなみにsystemdやsystemctlを理解するためにこちらのサイトが大変役に立ちました!
【入門】systemd とは?設定ファイルの書き方や自動起動の設定 | ほげほげテクノロジー (hogetech.info)

コンテナ作成、起動時のproxy設定

次はDockerイメージのビルトやコンテナを起動するときのproxy設定です。こちらも公式ドキュメントで紹介されている通り、~/.docker/config.jsonにproxyを設定してしまうのが一番簡単です。buildには–build-argオプションもありますが、毎回長いproxy設定を打ち込むのは面倒ですよね。またDockerfileにENVの環境変数で設定したproxyはRUN apt-getコマンドには反映されない点も注意が必要です。

設定方法は以下になります。まずホーム直下の隠しディレクトリ.dockerでエディターでconfig.jsonを作成します。以下ではvimを使っていますが、どのエディターでも大丈夫です。

$ cd ~/.docker
$ vim config.json

config.jsonに記載する中身は以下になります。微妙なスペースが多いので丸っとコピペ推奨です。

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http:<proxyサーバー>:<port番号>",
     "httpsProxy": "http:<proxyサーバー>:<port番号>",
   }
 }
}

これだけでbuildやrunコマンド実行時に長々とproxy設定のオプションを打ち込む必要がなくなります!公式にはno proxyの設定も記載されていますが、no proxyってどういうケースで必要なんでしょう・・・?

まとめ

今回の記事ではDocker daemonのproxy設定とコンテナ作成、起動用のproxy設定を分けて説明しました。

やはり公式ドキュメントは偉大ですね。公式ドキュメントは丁寧すぎて逆に初心者には理解できない場合もあったりするのですが、様々なネット記事に翻弄される前にまずは公式ドキュメントを一読することを心がけてみてください!

今回は以上になります。こちらの記事でdocker proxy問題でお悩みの初心者が一人でも減ることを祈ります。

コメント