DockerでTorアプライアンス(的なもの)を作ってみる

最近個人的に注目しているものにDockerがあるのですが、これ、簡単にいうと、Linuxの構成をコンテナ化して、システム間での可搬性を実現するシステムです。コンテナ内のプロセスは隔離されるため、要は仮想環境を構成するシステムなわけですが仮想マシンと違って環境を走らせるオーバーヘッドが非常に軽く、普通のソフトウェアを動作させる感覚でコンテナが実行できます。また、Ubuntuを使っていてCentOSやFedoraの環境を構成したい、というようなことも可能です。(Linuxをベースにして走らせる仕組みになっていますので、例えばWindowsを走らせたり、反対にWindowsからコンテナをそのまま実行したり、ということはできません。その場合は仮想環境を作るソフトが必要になります。)

どういうことに使えるか、というと

  • 現場環境に近いテスト環境を作成する
  • 環境をローカルで構築し、Dockerがデプロイされている環境にそのまま移植する)
  • メイン環境に手を加えずにシステムに変更を加えるようなソフトウェアを利用する(特にroot権限を要するようなプロセスを走らせないといけない場合、-vオプションなのでファイルシステムのアクセスを与えない限りファイルのアクセス権限はコンテナ内に制限されるため、比較的安全に実行できます。極端な話、コンテナ内でrm -rf /*が実行された場合でも外部にコンテナ外には影響は及びません。)

など、いろいろと考えられると思います。例えば、PHP実行環境のバージョンが異なったウェブサーバを立ち上げる、ということができるようになります。

今回これを利用してTorのアプライアンス的なものを作ってみることにしました。

Torのファイル自体は公式レポジトリのものを使用します。

空のディレクトリにDockerfileというファイルを作成し、以下のように記述しました。

FROM ubuntu:13.10
MAINTAINER Hideki Saito 
RUN echo "deb http://deb.torproject.org/torproject.org saucy main" >> /etc/apt/sources.list
RUN gpg --keyserver keys.gnupg.net --recv 886DDD89
RUN gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -
RUN apt-get update && apt-get install -y tor
ADD files/torrc /etc/tor/torrc
EXPOSE 9050
ENTRYPOINT ["tor"]

このスクリプトによりTorのレポジトリを追加し、インストールした上で、目的に書き換えたfiles/torrcを含めた上でコンテナ化する、という設定になっています。レポジトリがない場合でも、依存を設定した上で、最新ソースを引っ張り、コンパイルした上で配置、クリーンアップしてコンテナ化する、といったようなことももちろん可能になります。このファイルを作成した上で、files/torrcにTorの設定を記述し、docker build -t “hsaito/torbox” .を実行しました。すると自動的にapt-getによるファイルの入手や、インストールが行われ、ローカルのイメージリストにhsaito/torboxが作成されます。この場合はhsaito/torboxとして作成し、Docker Indexにプッシュしました。このプッシュという方式はGitによく似ています。プッシュやプルの場合、差分のみが送受信される形になります。

Dockerが強力などが派生環境を非常に手軽に作れることです。例えば、今回の例の場合、アプライアンスとしてのSOCKS環境ではなくて、Tor relayサーバをコンテナ化したいとします。そうなると必要なDockerfileの定義は以下のようになります。

FROM hsaito/torbox
MAINTAINER Hideki Saito 
ADD files/torrc /etc/tor/torrc
EXPOSE 9001
ENTRYPOINT ["tor"]

この場合、上記と違い「FROM hsaito/torbox」を設定しているため、すでにhsaito/torboxを持っている場合はそれが再利用され、差分だけがダウンロードされます。(こちらはhsaito/torbox-relayとしてプッシュしました。)そのため、レポジトリからTorをインストールしたりする定義は行っていません。変わっているのは独自のtorrcを差し替え、露出されるポート番号を変更しているだけになります。実は上記の場合も元のイメージの「ubuntu:13.10」を前提に作っています。これを利用することにより、例えばウェブサーバを含んだコンテナをまず作成しライブラリのみを差し替えた差分コンテナを作成する、という方法をとることにより、楽にコンテナ環境が作成・管理できます。

ちなみに上記はそれぞれdocker pull hsaito/torboxとすることでダウンロードし、docker run -d hsaito/torboxなどで実行できます。(relay版を使用する場合はhsaito/torboxをhsaito/torbox-relayに置き換えて下さい。