Docker おじさんです。
今回は
「顧客の本番環境がプロキシを通さないとインターネットに出れないことが判明した!!!」
という状況で焦らないためのメモ。
Docker のインストール
Debian / Ubuntu 前提で。
プロキシ環境下なので以下は普通に通らないと思うが、~/.bashrc
とかで環境変数 http_proxy
などを設定しても sudo
すると環境変数は引き継がれないのでそのままでは通らない。
$ sudo apt-get install docker.io
sudo
に -E
オプションを付ければ環境変数を引き継げば通るが毎回 -E
をつけるのが面倒なので、別の方法として apt の設定ファイルを書いてしまったほうが楽。
Acquire::http::Proxy "http://{HOST}:{port}";
Acquire::https::Proxy "http://{HOST}:{port}";
RHEL / CentOS の人は yum 用の設定方法があると思うので適当にググってやっていって欲しい。
Docker Engine
docker pull
などでイメージを落としてくる場合は Docker Engine にプロキシ設定をする必要がある。
単純に環境変数 HTTP_PROXY
HTTPS_PROXY
を設定すればいいのだが、最近は Systemd で動いていることがほとんどだと思うので Systemd の設定ファイルで環境変数を指定するのが手っ取り早い。
[Service]
Environment=HTTP_PROXY=http://{HOST}:{port}
Environment=HTTPS_PROXY=http://{HOST}:{port}
Docker イメージのビルド時
Docker イメージのビルド時に限らないが、 apt-get install
などでインターネットに出たい場合は、そのツールひとつひとつにプロキシ設定をする必要がある。
apt-get や pip などは環境変数を設定するだけでプロキシを通ってくれるので、とりあえず環境変数を設定しておき、個別に対応が必要なツールについては個別に対応していく、となる。ビルド時に環境変数を設定するには Dockerfile に環境変数を指定してもいいが、ARG を使うのがよさそう。
例えば Docker Compose の設定ファイルで args を指定する場合は、サービスの build オプションを以下のように指定する。
build:
context: .
args:
- http_proxy=http://{HOST}:{port}
- https_proxy=http://{HOST}:{port}
- HTTP_PROXY=http://{HOST}:{port}
- HTTPS_PROXY=http://{HOST}:{port}
ツールによって対応している環境変数名が大文字だったり小文字だったりするので、両方指定しておいたほうが良い。
(例えば apt-get は大文字の HTTP_PROXY
を指定しても認識してくれない)
Docker コンテナ起動時
コンテナ起動時はビルド時と同様にツールひとつひとつにプロキシ設定をする必要があるため、個別対応以外で出来ることといえば環境変数を設定するだけとなる。
コンテナ起動時に毎回環境変数を指定するのは手間なので、 ~/.docker/config.json
を書いておくとコンテナ内に HTTP_PROXY
などを自動で設定してくれる機能を使うと楽。
{
"proxies": {
"default": {
"httpProxy": "http://{HOST}:{port}",
"httpsProxy": "http://{HOST}:{port}"
}
}
}
Configure Docker to use a proxy server | Docker Documentation
[追記] これ、どうやら Docker Compose のときには使えないっぽい・・・?
その他
Docker 以外の設定で環境変数では対応できないやつ (git とか curl とか boto3 とか) そのへんはググって個別によしなに設定する。