はじめに
IPアドレスがひとつしか貰えないVPSで、サービスごとのコンテナを作って運用したい。
しかもFreeBSDで。
...というわけで、さくらのVPSで実際にやってみました。
概要
ターゲットは、FreeBSD 10.0-RELEASEです。
コンテナは、FreeBSDに標準機能のjailを使用します。現段階ではezjail等のサポートツールは使用しません。
jail(監獄)になぞらえて以降は、ホストはJailer(看守)、コンテナはPrisoner(囚人)と書きます。
手順
FreeBSD 10.0 RELEASEがインストール済みであることを前提にします。
Prisonerのファイルを用意
Prisonerを置くディレクトリを作成します。
例として、/home/jailsとします。
# mkdir /home/jails
bsdinstallerを使ってファイルを用意します。
baseという名前でPrisonerを作成します。
# cd /home/jails
# bsdinstall jail base
ミラーサイトの選択の後、追加パッケージの選択になります。
ここでは、lib32があれば十分です。
ウィザードに従い、インストールを終わらせます。
jailの設定ファイルを作成
Jailerにjailの設定ファイルを作成します。
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
path = "/home/jails/$name";
host.hostname = $name;
base {
ip4.addr = <JailerのIPアドレス>;
allow.chflags;
allow.raw_sockets;
}
baseというPrisonerに対して、
- Jailerと同じIPアドレスを割り当て
- RAW SOCKETの使用許可(ping等が使用できるようにするため)
- chflagsの使用許可(freebsd-updateが実行できるようにするため)
を与えています。
Prisonerの起動とコンソール立ち上げ
JailerでPrisonerを起動します。
# service jail onestart base
引き続き、シェルを起動しPrisonerの環境に入ります。
# jexec base /bin/csh
シェルが起動すれば、Prisonerの環境下でpkgコマンドでパッケージを追加することも可能です。
PrisonerのコンソールでexitすることでJailer環境のシェルに戻ります。
おわりに
公式のFreeBSDハンドブックを始めJailerとPrisonerは別のIPアドレスを使う説明がほとんどで、小飼さんのブログを読むまで同じIPアドレスが使用できることを知りませんでした。
VIMAGEでJailerとPrisonerでプロトコルスタックを分離してnaptとか考えてましたが、そんな難しいことをする必要はありませんでした。
Dockerがキッカケでコンテナ化が注目を集めていますが、FreeBSDにもずーっとjailという手段があるということ知っていただければと思います。