こめ吉のQOL向上計画

なんとなく書きます

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

  1. systemdを使う方法
  2. 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設定を行う思考になかなか至りませんでした。

なにはともあれ、解決して良かったです。