LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第1回LXCとコンテナの基本

はじめに

みなさま、はじめまして。加藤と申します。最近注目を集めている仮想化技術の『コンテナ』に関する連載を始めることになりました。よろしくお願いいたします。

コンピュータの性能が向上し、仮想化という言葉も一般的になりました。従来はVPS等のサービスやIaaS、クラウドといったキーワードと共に語られることが多かった仮想化ですが、最近では開発者自身のPC上で仮想化を使ってテスト環境を作成し、使い終わったら消去するという使われ方が増え、仮想化技術を扱うエンジニアも、インフラエンジニアからアプリ開発者まで広くなりました。

また、従来は仮想的なマシンをコンピュータ上で実現するVMware、Hyper-V、KVMといった技術が話題になることが多かったことに対し、最近ではImmutable Infrastructureといったキーワードと共に『コンテナ』が話題になることが増えました。⁠コンテナ』とは先に述べた仮想マシンを実現する仕組みに比べて軽量な仮想化の仕組みです。Immutable Infrastructureでは、素早く構築や破棄ができ、ポータビリティにも優れた軽量な環境という特徴を持つコンテナを使うことが多いからです。

最近ではコンテナ技術を要素技術のひとつとして使用しているDockerが注目を集めていますが、この連載ではコンテナ環境そのものの操作に特化したソフトウェアであるLXCを取り上げ、その使い方とコンテナの簡単な仕組みについて説明していきます。

LXCのWebページ

LXCのWebページ

LXCとLinuxにおけるコンテナ技術

"LXC"はLinuX Containerの略ですが、異なる意味で使われることがあります。⁠Linuxカーネルが持つ機能を使って実現するコンテナ』という一般的な意味で使う場合と、⁠linuxcontainers.org で開発されているコンテナを扱うためのソフトウェア』という狭い意味で使われることがあります。この連載は後者の意味でのLXCを扱いますので、"LXC"と書いた場合後者を指すことにします。

LXCは、Linuxカーネルにコンテナ関連の機能が実装され始めた2008年ごろから、カーネルの機能のみを用いてコンテナの操作を行うソフトウェアとして開発されています。Linuxカーネルにパッチを当てたりすることなく、カーネルに実装されているコンテナに関係する機能をフルに活用して簡単にコンテナの操作が行える実装です。

LXCの他にもLinuxでコンテナを実現するためのソフトウェアは多数存在します。ここで代表的なものを挙げ、簡単に説明したいと思います。

  • OpenVZ
  • Virtuozzo
  • libvirt
  • Docker

OpenVZ

OpenVZは、Linuxカーネルにコンテナ関連の技術が充分に実装されていないかなり前から、Linuxカーネルにパッチを当ててコンテナを実現してきました。OpenVZとそれを元にした商用ソフトであるパラレルスのVirtuozzoは、以前から世界中のホスティングサービスで広く使われてきており、現在でも広く使われている十分に安定した実用的なソフトウェアです。現在のLinuxカーネルに実装されているコンテナ関連の実装にはOpenVZ由来のものが多くありますし、現在でもOpenVZの開発者が実装を進めている機能が存在します。

libvirt

libvirtは仮想マシンの操作を行う共通のAPIを提供するライブラリで、さまざまな仮想化をサポートしています。その中で"LXC"をサポートしています。注意が必要なのは、libvirtがサポートする"LXC"は、前述の広義のLXCであり、この連載で扱っていくLXCとは別の実装です。

Docker

DockerはDocker Inc.によって開発されたGo言語で書かれたソフトウェアです。元々はコンテナを実現するためにLXCを使っていましたが、最近のリリースである0.9で自身でコンテナを作成するライブラリを実装し、デフォルトではそちらを使うようになりました。Dockerは単なるコンテナの実装という枠を大きく超えるソフトウェアで、最近では情報も豊富ですので、そちらをご参照ください。技術評論社からも電子書籍が出ましたね

この他にもsystemdに簡単なコンテナを実現するコマンドが含まれていたり、Cloud Foundryでコンテナ機能を実現するためのWardenなど、いくつかコンテナの実装がありますし、もちろんLinux以外でもコンテナの実装はいくつか存在します。

まずは使ってみましょう

先にLXCについて、簡単にコンテナの操作が行えると紹介しました。それではここでどれくらい簡単にコンテナの操作ができるのかを紹介してみましょう。

ここではLXCでは最も一般的な環境であるUbuntuを使用してコンテナを起動してみます。Ubuntuは、先日リリースされたばかりのUbuntu 14.04 LTSを使います[1]⁠。

まずインストールです。以下のように実行するだけで非常に簡単です。

$ sudo apt-get install lxc

インストールが済んだら、コンテナの環境を作成してみましょう。以下のように実行します。

$ sudo lxc-create -t ubuntu -n ubuntu01

これで"ubuntu01"という名前のUbuntuのコンテナ環境と設定ファイルが作成されます。作成はリポジトリからパッケージをダウンロードしてインストールしますので、しばらく時間がかかります。

このコマンドが正常に終了したら、コンテナを起動する準備はできていますので、以下のようにコンテナを起動するコマンドを実行します。

$ sudo lxc-start -n ubuntu01 -d

これは"ubuntu01"という名前のコンテナをデーモンとして実行します。このコマンドの実行が終了して、シェルのプロンプトが表示されれば、コンテナが起動しているはずですので、それを確認してみましょう。以下のように実行します。

$ sudo lxc-ls --fancy
NAME      STATE    IPV4       IPV6  AUTOSTART
---------------------------------------------
ubuntu01  RUNNING  10.0.3.18  -     NO

lxc-lsはシステム上に存在するコンテナの一覧を表示するコマンドです。コンテナのIPアドレスはDHCPで割り当たっていますので、お手元で試した場合とは異なると思いますが、"STATE"が"RUNNING"となっていれば無事コンテナは起動しています。

先にlxc-createコマンドで-t ubuntuと指定してUbuntuのコンテナ環境を作成した場合、デフォルトではubuntuというユーザが、パスワードubuntuで作成されますので、表示されているIPアドレスに対してsshで接続して利用できます。また、以下のように実行するとログインプロンプトが表示されますので、コンソールログイン経由でも利用できます。

$ sudo lxc-console -n ubuntu01

実行中のコンテナを終了させるには、ログインした状態でshutdownコマンドを実行してシャットダウンできます。また、コンテナを実行したホスト上で以下のようなコマンド実行しても停止できます。

$ sudo lxc-stop -n ubuntu01
$ sudo lxc-ls --fancy
NAME      STATE    IPV4  IPV6  AUTOSTART
----------------------------------------
ubuntu01  STOPPED  -     -     NO

いかがでしょう? 非常に簡単に「コンテナ」の作成、起動、終了ができているのがわかるかと思います。実際に実行してみた方は、コンテナが非常に高速に起動しているのがおわかりいただけたのではないでしょうか。

次回以降について

次回以降では、コンテナの仕組みや特徴について説明したあと、LXCのもう少し詳細な解説や、LXCが使っているLinuxカーネルのコンテナ関連の機能についての説明を行います。

その後、今回簡単に使い方をあげたUbuntuを含めたいくつかのディストリビューションでのLXCの使用方法や、LXCのコマンドの細かい使い方について解説する予定です。

おすすめ記事

記事・ニュース一覧