業界で話題になってるDockerですが、Docker以外にも素晴らしいコンテナ技術があります。
今回はLXC(Linux Container)を紹介します。
LXCとDockerの違い
Dockerはそもそもアプリケーションのデプロイを目的として作られました。だから「1コンテナ1プロセス」の仕組みをとっています。起動時に/sbin/initを叩くこともしません。ほとんど「隔離環境」に近いでしょう。
(まあ実は/sbin/initを叩かせてDockerコンテナを通常のLinux仮想マシンとして動作させることもできますが。)
しかしLXCは、そもそも軽量な仮想マシンを動作させることを目的としているため、起動するイメージはOSのフルイメージであり、initやsystemdも完全に動作します。アプリケーションではなく単純な仮想マシンを作るためだけなら、こちらのほうが優れているでしょう。
もちろん両方とも、chrootやcgroups等のカーネルの機能を使っていることに違いはありませんが。
(追記: どうやら最近Dockerはchrootやcgroupsを使わずに自前で開発している模様です)
比較表
Docker | LXC | |
---|---|---|
用途 | アプリケーションのデプロイの効率化・セキュリティ性の向上 | コンテナを利用した仮想マシンの作成 |
イメージ | 公式サイトにあるさまざまなイメージを、手軽に利用できる | 基本的に、有名なテンプレートのみ用意されている。(Ubuntu,Centos, etc...) |
ファイルシステム | イメージ。実態は1つのファイル | 色々サポートしている。差分管理も可能。ディレクトリ形式にすれば、ホストからクライアントをマウントできて便利。 |
速度 | 作成・開始・停止・破棄ともに高速 | 作成と破棄は、OSイメージをまるまる一個コピーしてるため遅い。2分くらいかかる。開始・停止はDockerとの体感時間の差はない。 |
管理 | Docker swarmやcomposeがある | 特に無い(はず)。だがOpenstack等で仮想マシンのハイパーバイザをKVM等からLXCに変更できる。 |
ネットワーク | どうしてもNATを挟まなければ動かせず、また複雑なことは難しい。Dockerが内部的にiptableを利用している。 | 所属するブリッジやipアドレスなどを柔軟に割り当てられる。ホストと同じLANに所属させることも可能 |
操作
Docker | LXC | |
---|---|---|
コンテナ作成 | docker create | lxc-create |
コンテナ起動 | docker start | lxc-start |
コンテナのttyに接続 | docker attach | lxc-attach |
コンテナの終了 | docker stop | lxc-stop |
コンテナの破棄 | docker rm | lxc-destroy |
これだけ見る限り、操作の変更点は殆ど無い。
まとめ
Dockerを授業や大会等で仮想マシン代わりに使おうとしてるフレンズは、LXCを使うともっと楽でいいかもしれない。
(以前シェル芸でLXCを150個立ち上げて設定をして、とある大会で参加者が触れるようにしていました。)