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

第26回 LXCの構築・活用[12] ─ APIと言語バインディング

この記事を読むのに必要な時間:およそ 4 分

第8回以降,LXCをインストールした際にインストールされる"lxc-"で始まる付属のコマンド群を使って,LXCの機能を紹介してきました。今回は,独自のプログラムをLXCを使って開発する際に使うAPIと言語バインディングについて簡単に紹介しましょう。

Ubuntuでは,"lxc-"で始まるコマンド群は"lxc"パッケージに含まれています。"lxc"パッケージをインストールする際,依存関係により"liblxc1"というパッケージがインストールされます。この"liblxc1"パッケージに含まれるliblxcは,文字通りLXCを使ってコンテナを扱うためのライブラリです。いわば,これがLXCのコアとなる部分で,C言語のAPIを提供するライブラリです。

"lxc-"で始まるコマンド群は,このliblxcが提供するAPIを使い実装されています。liblxcを使って何かプログラムを書く場合は,これらのコマンド群自身がliblxcが提供するAPIを使う際の良い例となるでしょう。

"lxc-"で始まるコマンド群は,コンテナに関する一般的な操作を行うコマンドしかありません。自身のコンテナを利用するアプリケーションやシステムを実装する際,独自の操作を実装するとともに,その中でAPIを使用してコンテナを操作するような独自のコマンドを実装できます。

しかし,実際にはC言語でプログラムを書く場合だけでなく,C言語以外のスクリプト言語を使う場合も多いはずです。そのような場合に備えて,LXCでは各種言語のバインディングが用意されています。

LXCのソースには言語バインディングとして,

  • Python3
  • Lua

が同梱されています。

"lxc-"で始まるコマンド群の中にもこれらの言語バインディングを使って書かれているコマンドがあります。たとえば前回紹介したlxc-start-ephemeralコマンドや,コンテナのリストを表示するlxc-lsコマンドはPython3で書かれています。また,Ubuntuではインストールされていませんが,コンテナの一覧をtopコマンドのように表示するlxc-topというコマンドがLuaを使って書かれています。

また,ソースツリーと別に以下の言語バインディングが存在します。

Haskell以外はLXCの公式リポジトリ以下に存在しています。Go言語のバインディングは,LXC関連のプロダクトで開発が非常に活発なLXDに使われていますので,今一番活発に利用されている言語バインディングかもしれません。

C

C言語からliblxcを使う場合は,linuxcontainer.hを参照してください。ここに挙がっているものだけが公開のAPIとなります。

開発のmasterブランチから生成したAPIドキュメントもあります。このドキュメントはソースから生成できます。

APIを使ってコンテナを作成し,起動してみましょう。

  • コンテナ名は"gihyo"
  • downloadテンプレートを使用
  • 使用するイメージはUbuntu Trustyのamd64版イメージ
  • ストレージバックエンドは"dir"を使用
 1: #include <stdio.h>
 2: #include <lxc/lxccontainer.h>
 3:
 4: int main() {
 5:     struct lxc_container *c;
 6:     int ret = 1;
 7:
 8:     /* 新しいコンテナの作成,名前は"gihyo" */
 9:     c = lxc_container_new("gihyo", NULL);
10:     if (!c)
11:         goto out;
12:
13:     /* コンテナの作成 */
14:     if (!c->createl(c, "download", "dir", NULL, LXC_CREATE_QUIET,
15:                     "-d", "ubuntu", "-r", "trusty", "-a", "amd64", NULL)) {
16:         fprintf(stderr, "Failed to create container\n");
17:         goto out;
18:     }
19:
20:     /* コンテナの起動 */
21:     if (!c->start(c, 0, NULL)) {
22:         fprintf(stderr, "Failed to start container\n");
23:         goto out;
24:     }
25:
26:     /* コンテナ名,コンテナの状態を表示 */
27:     printf("Container %s is %s\n", c->name, c->state(c));
28:
29:     ret = 0;
30:
31: out:
32:
33:     /* 後始末 */
34:     lxc_container_put(c);
35:     return ret;
36: }

簡単に処理を追って説明します。

  • 9行目でlxc_container_newを使い,LXCでコンテナを表すlxc_container構造体を作成します。このlxc_container構造体に,コンテナの持つ属性やコンテナを操作する関数が全て入っています。あとはこの構造体内の関数を呼び出してコンテナの操作を行います。
  • 13行目でlxc_container構造体に定義されたcreatelを使い,コンテナの作成を行っています。これはちょうど以下のコマンドの実行と同じです。
lxc-create -t download -n gihyo -- -d ubuntu -r trusty -a amd64
  • 21行目でstartを使いコンテナを起動しています。これはlxc-startコマンドに相当します。
  • 27行目でコンテナが起動したことを確認するためにコンテナ名とコンテナの状態をstateを使って表示しています。
  • 34行目は後始末です。確保したlxc_container構造体を開放しています。

このプログラムをgihyo.cという名前で保存し,以下のようにコンパイルして起動してみます。

$ gcc -o gihyo gihyo.c -llxc
$ sudo ./gihyo
Container gihyo is RUNNING

実行すると以上のようにコンテナが実行中であることが表示されます。stateを使うと第10回で紹介したコンテナの状態が取得でき,ここでは実行中である"RUNNING"が表示されています。

このように起動したコンテナはlxc-startで起動したコンテナと同じように実行されていますので,lxc-で始まる付属コマンドで操作できます。

$ sudo lxc-ls -f
NAME   STATE    IPV4        IPV6  AUTOSTART  
-------------------------------------------
gihyo  RUNNING  10.0.3.166  -     NO         

lxc-lsコマンドで状態の表示ができました。lxc-stopコマンドで停止させてみましょう。

$ sudo lxc-stop -n gihyo
$ sudo lxc-ls -f
NAME   STATE    IPV4  IPV6  AUTOSTART  
-------------------------------------
gihyo  STOPPED  -     -     NO         

以上のように停止しましたね。

liblxc1が提供しているAPIは比較的シンプルですので,linuxcontainer.hを見たり,付属のコマンドを見たりして試してみてはいかがでしょうか。

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ。ファーストサーバ株式会社所属。

Twitter:@ten_forward
技術系のブログ:http://tenforward.hatenablog.com/

コメント

コメントの記入