Solarisコンテナを使ってみる

Solarisコンテナを使ってみることに。


コンテナって何?って場合は@ITの記事が判りやすいかも。

XenとかVMwareのような仮想化技術の一つなんだけど、Solarisの上で複数のSolarisが動いてるイメージ。



ベースになるOSの事を大域ゾーン。その上で動くSolarisの事を非大域ゾーンと呼ぶらしい。

で、非大域ゾーンを作ってみる。

# zonecfg -z zone1
zone1: そのような構成済みゾーンはありません
'create' を使用して、新しいゾーンの構成を開始してください。
zonecfg:zone1> create
zonecfg:zone1> set zonepath=/export/zone/zone1
zonecfg:zone1> set autoboot=true
zonecfg:zone1> add net
zonecfg:zone1:net> set address=192.168.250.2
zonecfg:zone1:net> set physical=hme0
zonecfg:zone1:net> end
zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit
zonepathってのが、非大域ゾーンに割り当てるパス。で、非大域ゾーンのネットワークの設定をしてあげる。これだけで、ゾーン作りは完了。

確認すると、今作った非大域ゾーン(zone1)が出来てる。

# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP   
   0 global           running    /                              native   shared
   - zone1            configured /export/zone/zone1             native   shared

で、非大域ゾーンにインストール。と言っても、大域ゾーンからインストールされるので、コマンドを打つだけ。
# zoneadm -z zone1 install
Preparing to install zone <zone1>.
Creating list of files to copy from the global zone.
Copying <7337> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1158> packages on the zone.
Initialized <1158> packages on zone.                                
Zone <zone1> is initialized.
The file </export/zone/zone1/root/var/sadm/system/logs/install_log> contains a log of the zone installation.
続けて非大域ゾーンのOSを起動します。
# zoneadm -z zone1 boot
確認してみますね。
# zoneadm list -vc  ID NAME             STATUS     PATH                           BRAND    IP   
   0 global           running    /                              native   shared
   3 zone1            running    /export/zone/zone1             native   shared

ちゃんとrunningになってますね(^^


で、非大域ゾーンのコンソールに接続します。
# zlogin -C zone1
[ゾーン 'zone1' コンソールに接続しました]

Select a Language

  0. English
  1. Japanese

Please make a choice (0 - 1), or press h or ? for help: 1
ここからOSをインストールするって感じですかね。で、まぁ、普通通りインストールしてというか、初期設定をすると非大域ゾーンがリブートして、起動します。

System identification is completed.

rebooting system due to change(s) in /etc/default/init


[注意: ゾーンをリブートしています]


SunOS Release 5.10 Version Generic_138889-08 64-bit
Copyright 1983-2009 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
Hostname: testzone
Reading ZFS config: done.

testzone console login:
ここからはほぼ普通に使えます。ちなみにzloginから抜けるには、~ ^D(チルダ, Ctrl+D)と入力します。どことなくtipやsshみたいです。

ちょっと厄介なのが、ファイルの継承。
大域ゾーンのOSから一部のディレクトリやファイルを共有して使えるのですが、(ディスクの消費量を減らせるので、悪いものではないが)、その部分はRead-onlyでマウントされてるんです。
つまり/usr/localとか、変更したり、追加したり出来ないんです。。

色々と不便なので/usrの継承は止めることにします。その分ディスクは消費しますが、仕方ないです。

一旦zoneをアンインストールします。
# zoneadm -z zone1 uninstall
そしてzonecfgで継承の設定を変更します。
zonecfg:zone1> remove inherit-pkg-dir dir=/usr
zonecfg:zone1> commit
zonecfg:zone1> exit
そして再インストールします。
# zoneadm -z zone1 install

ちなみにzloginとか使ってると、今自分がどこのzoneにいるのか判らなくなって来ます。その時はzonenameでどのゾーンに居るかを表示します。
$ zonename
global ← 大域ゾーン


そして大域ゾーンからみると全プロセスが見える!!
これはビックリしました。当たり前なんだけど。最初気付かずに非大域ゾーンで動かしてるプロセスが大域ゾーンで起動しているように見えたので、killしまくってました(^^;
判りやすいchrootだと思って使うのが良いのかも。

例えば、これまでは1台で外部DNSと内部DNSを運用しようと思ったらViewで分けるか、namedを2つ起動してバインドするIPアドレスを分ける必要があったけど、コンテナを使うとあたかも2台のサーバがあるように操作できるので、シンプルな設定で実現できるのが良いです。