apt-cacher-ng サービスの Docker 化

複数の Docker サーバを持っている場合や、Docker 構築キャッシュを使わない Docker コンテナを構築する場合は、パッケージ用のキャッシュ・プロキシを使うと便利です。このコンテナは、パッケージを既にダウンロード済みの環境から二次ダウンロードできるようにします。

以下の Dockerfile を使います。

#
# Build: docker build -t apt-cacher .
# Run: docker run -d -p 3142:3142 --name apt-cacher-run apt-cacher
#
# and then you can run containers with:
#   docker run -t -i --rm -e http_proxy http://dockerhost:3142/ debian bash
#
# Here, `dockerhost` is the IP address or FQDN of a host running the Docker daemon
# which acts as an APT proxy server.
FROM        ubuntu
MAINTAINER  SvenDowideit@docker.com

VOLUME      ["/var/cache/apt-cacher-ng"]
RUN     apt-get update && apt-get install -y apt-cacher-ng

EXPOSE      3142
CMD     chmod 777 /var/cache/apt-cacher-ng && /etc/init.d/apt-cacher-ng start && tail -f /var/log/apt-cacher-ng/*

イメージを構築するには、次のようにします。

$ docker build -t eg_apt_cacher_ng .

それから実行します。公開されたポートをホスト側に割り当てます。

$ docker run -d -p 3142:3142 --name test_apt_cacher_ng eg_apt_cacher_ng

ログファイルを参照します。デフォルトのコマンドに ーf (末尾を表示)オプションを付けます。

$ docker logs -f test_apt_cacher_ng

Debian をベースとしたコンテナで proxy を使うには、以下の手順とオプションを進めます。このとき dockerhost の箇所は test_apt_cacher_ng コンテナを実行するホストの IP アドレスか FQDN を置き換える必要があります。

  1. apt プロキシ設定を追加します。

echo 'Acquire::http { Proxy "http://dockerhost:3142"; };' >> /etc/apt/conf.d/01proxy
  1. 環境変数を設定します: http_proxy=http://dockerhost:3142/

  2. sources.list エントリを変更し、 http://dockerhost:3142/ から始めるようにします。

  3. --link を使って APT proxy コンテナを Debian ベースのコンテナにリンクします。

  4. Debian ベースのコンテナで、APT proxy コンテナに接続するカスタム・ネットワークを作成します。

オプション1 :apt 設定を安全に行うには、共通の基盤となるバージョンで apt 設定を行う方法があります。

FROM ubuntu
RUN  echo 'Acquire::http { Proxy "http://dockerhost:3142"; };' >> /etc/apt/apt.conf.d/01proxy
RUN apt-get update && apt-get install -y vim git

# docker build -t my_ubuntu .

オプション2http_proxy 設定はテストに便利ですが、 curlwget のような HTTP クライアントでは動作しない場合があります。

$ docker run --rm -t -i -e http_proxy=http://dockerhost:3142/ debian bash

オプション3 : これは最新版を取り入れるためですが、 Dockerfile では何度が記述が必要になるかもしれません。

オプション4 :Debian コンテナを proxy サーバに次のコマンドでリンクします。

$ docker run -i -t --link test_apt_cacher_ng:apt_proxy -e http_proxy=http://apt_proxy:3142/ debian bash

オプション5 :APT proxy サーバと Debian ベースのコンテナが接続するカスタム・ネットワークを作成します。

$ docker network create mynetwork
$ docker run -d -p 3142:3142 --net=mynetwork --name test_apt_cacher_ng eg_apt_cacher_ng
$ docker run --rm -it --net=mynetwork -e http_proxy=http://test_apt_cacher_ng:3142/ debian bash

apt-cacher-ng はリポジトリを管理するのと同じツールを持っています。 VOLUME 命令を使い、サービスを実行するイメージを構築します。

$ docker run --rm -t -i --volumes-from test_apt_cacher_ng eg_apt_cacher_ng bash

$$ /usr/lib/apt-cacher-ng/distkill.pl
Scanning /var/cache/apt-cacher-ng, please wait...
Found distributions:
bla, taggedcount: 0
     1. precise-security (36 index files)
     2. wheezy (25 index files)
     3. precise-updates (36 index files)
     4. precise (36 index files)
     5. wheezy-updates (18 index files)

Found architectures:
     6. amd64 (36 index files)
     7. i386 (24 index files)

WARNING: The removal action may wipe out whole directories containing
         index files. Select d to see detailed list.

(Number nn: tag distribution or architecture nn; 0: exit; d: show details; r: remove tagged; q: quit): q

最後に、コンテナのテストが終わったら、クリーンアップのためにコンテナを停止・削除し、イメージを削除します。

$ docker stop test_apt_cacher_ng
$ docker rm test_apt_cacher_ng
$ docker rmi eg_apt_cacher_ng

参考

Dockerizing an apt-cacher-ng service

https://docs.docker.com/engine/examples/apt-cacher-ng/