Rootlessモードのdockerでproxy設定を行う
dockerのRootlessモードとは通常root権限の必要なdockerをroot権限無し(=rootless)で実行可能にしたものです。Rootlessモードではdockerの一部機能は制限されますが、多くの機能は実行可能になっているようです。 今回proxy環境下でのproxy設定に苦戦したので設定方法をまとめます。自分はCentOS7.8を使用していたため苦戦しましたが、Ubuntuを含むdebian系では公式の手順に従えば設定できるはずです。
自分の環境
- CentOS 7.8
- docker 19.03 (Rootlessモード使用)
Rootlessモードのdockerデーモンの起動方法として、以下の2種類があります1。
- systemdを使う方法
- dockerd-rootless.shを実行する方法
公式で案内されているproxyの設定方法は方法1に基づきます2。しかし、自分の環境で使用しているCentOS7では方法1で実行する”systemctl --user"を実行することはできません(CentOSを含むRHEL系では無効化されいるらしい3)。そのため方法2でproxy設定を行います。 方法2でのproxy設定に関して直接的な記載はありませんが、
The daemon config dir is set to ~/.config/docker (not ~/.docker, which is used by the client) by default.
との記載があり、~/.config/docker がdockerデーモンの設定ファイルのディレクトリであることが分かります。このディレクトリを確認すると自分の場合、key.jsonがありました。どうやらjson形式でproxy設定を書けば良さそうだと分かったので、clientのproxy設定方法にならい4以下の内容のファイル(config.json)を作成し、~/.config/docker/に配置しました。
{ "proxies": { "default": { "httpProxy": "http://127.0.0.1:3001", "httpsProxy": "http://127.0.0.1:3001", "noProxy": "*.test.example.com,.example2.com" } } }
その後、dockerデーモンの起動方法2を実行しデーモンを起動します(既にデーモンを起動している場合は落としてから再起動してください)。その上でdocker buildを実行しproxy設定が上手くいったことを確認しました(自分の環境ではBuildKit使用)。
解決方法はシンプルですが、通常のdockerデーモンはsystemdで立ち上げ、systemdでproxy設定を行っていたため、clientと同じようなproxy設定を行う思考になかなか至りませんでした。
なにはともあれ、解決して良かったです。