Proxy環境下でDockerを動かす

Docker1.0がリリースされたことで,プロダクションレディ感もあり,企業でもDockerを使う機運が高まっている.でも,実際はまだまだ本番環境ではなく,テスト環境などで使われることが多い.

Dockerによるテスト環境構築でまず思い浮かぶのはdokku.dokkuはDockerを使ったbash実装のPaaS.プライベートPaaSを持たない,かつHerokuなどを気軽に使えない企業のテスト環境として今後使われる機会がありそう.

ただ,個人での利用とは違い企業などでDockerやdokkuを使う場合は,Proxyに阻まれることがある(というか今日阻まれた).ので,Proxy環境下でのDocker,dokkuの使い方を簡単にまとめておく.まず,Docker全般に関して,次にdokku特有の問題についてProxyの問題を解決しなければならない状況とその解決方法を説明する.

Proxy環境下でのDocker

Dockerを使う中で,外部ネットワークとのやりとりが必要になるのは,以下の3つの場合が考えられる.

  • DockerHub(Docker Index)とのやりとり
  • Dockerfile
  • Dockerコンテナ

これらの解決方法をそれぞれ説明する.

DockerHub(Docker Index)

まずは,DockerHub(Docker Index)とのやりとりを行う場合.例えば,docker pullなどでイメージを取得する場合など.

この場合は,dockerデーモンを起動する際にhttp_proxy環境変数を設定すればよい.例えば,Ubuntuの場合は,Upstartの設定ファイル/etc/default/dockerexport http_proxy=<HTTP_PROXY>を記述すればよい.

Dockerfile

次に,Dockerfileで外部ネットワークとやりとりを行う場合.例えば,apt-getなどでパッケージをインストールする場合など.

この場合は,ENVコマンドを使ってDockerfile内で環境変数を設定すればよい.

FROM ubuntu:13.10
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN apt-get -y update

Dockerコンテナ

最後は,docker runでコンテナを起動した後に,コンテナ内から外部ネットワークとやりとりをする場合.例えば,サードパーティー製のDockerイメージをそのまま使う場合など.

この場合は,-eオプションを使ってhttp_proxy環境変数を設定してコンテナを起動すればよい.

$ docker run -d \
    -e "http_proxy=<HTTP_PROXY>" \
    progrium/buildstep /build/builder

Proxy環境下でのdokku

dokkuのインストール以外で,dokkuが外部ネットワークとやりとりするのは以下の2カ所.

  • dokku専用のDockerイメージprogrium/buildstepのpull
  • Buildpackを使ったアプリケーションのビルド

1つ目は上記のDockerHubとのやりとりで示した方法で解決できる.2つ目は若干のハックが必要になる.

dokkuはHerokuと同様にアプリケーションのビルドにBuildpackを使用し,依存パッケージ等のインストールを行う.このビルドは,dokku専用のDockerイメージprogrium/buildstepを使い,そのコンテナ内で実行される.よって,そのときにProxyが設定されている必要がある.これは上記のDockerコンテナで示した方法で解決できる.

dokkuは,bash実装なので,/usr/local/bin/dokkuを直接編集してしまえばよい.編集するのは,build/builderコマンドと共にコンテナを起動するところ.そこで-eオプションを使って環境変数を設定すればよい.

具体的には,

id=$(docker run -d -v $CACHE_DIR:/cache $IMAGE /build/builder)

を以下のようにする.

id=$(docker run -d -v $CACHE_DIR:/cache -e "http_proxy=<HTTP_PROXY>" -e "https_proxy=<HTTP_PROXY>" $IMAGE /build/builder)

でも,ソースいじるのはあれだから良い方法があれば教えてください.