第8回以降、
Ubuntuでは、
"lxc-"で始まるコマンド群は、
"lxc-"で始まるコマンド群は、
しかし、
LXCのソースには言語バインディングとして、
- Python3
- Lua
が同梱されています。
"lxc-"で始まるコマンド群の中にもこれらの言語バインディングを使って書かれているコマンドがあります。たとえば前回紹介したlxc-start-ephemeral
コマンドや、lxc-ls
コマンドはPython3で書かれています。また、top
コマンドのように表示するlxc-top
というコマンドがLuaを使って書かれています。
また、
Haskell以外はLXCの公式リポジトリ以下に存在しています。Go言語のバインディングは、
C
C言語からliblxcを使う場合は、
開発の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.
という名前で保存し、
$ gcc -o gihyo gihyo.c -llxc $ sudo ./gihyo Container gihyo is RUNNING
実行すると以上のようにコンテナが実行中であることが表示されます。state
を使うと第10回で紹介したコンテナの状態が取得でき、
このように起動したコンテナは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は比較的シンプルですので、
Python
自身が開発するアプリケーションやシステム内でAPIを使ってLXCコンテナを操作する場合、
ここではスクリプト言語からコンテナを操作する例として、
C言語で示した例と同様にコンテナを作成し起動した後、
1: #!/usr/bin/python3
2: import lxc
3: import sys
4: import socket
5:
6: # ホスト名を表示する
7: def print_hostname():
8: print("Hostname: {}".format(socket.gethostname()))
9: return 0
10:
11: # 新しいコンテナの生成、名前は"gihyo"
12: c = lxc.Container("gihyo")
13: if c.defined:
14: print("Container already exists", file=sys.stderr)
15: sys.exit(1)
16:
17: # コンテナの作成
18: if not c.create("download", lxc.LXC_CREATE_QUIET, {"d": "ubuntu",
19: "r": "trusty",
20: "a": "amd64"}):
21: print("Failed to create container", file=sys.stderr)
22: sys.exit(1)
23:
24: # コンテナの起動
25: if not c.start():
26: print("Failed to start container", file=sys.stderr)
27: sys.exit(1)
28:
29: # コンテナ名、コンテナの状態を表示
30: print("Container {} is {}".format(c.name, c.state))
31:
32: # コンテナ内でprint_hostnameを実行
33: c.attach_wait(print_hostname)
34:
35: sys.exit(0)
29行目でコンテナの状態を表示しているところまではC言語の例と同じです。その後attach_
という関数を使って5〜8行目で定義したprint_
という関数を実行しています。
print_
はホスト名を表示するだけの簡単な関数です。attach_
はlxc-attach
と同様に指定したコンテナの名前空間内で指定した処理をするための関数ですので、print_
はコンテナ内で実行されます。
このスクリプトを実行すると、gihyo
というホスト名が表示されます。
$ sudo python3 gihyo.py Container gihyo is RUNNING Hostname: gihyo
このようにスクリプト言語を使用すると、
これ以外にも、
まとめ
今回はCとPythonの簡単なプログラムを使って、
APIやバインディングを用いて、
バインディングについては、
また、
- LXC公式ページのドキュメントページ (日本語訳)
- Stéphane Graber氏のブログ記事"LXC 1.
0 blog post series"の第8回"LXC 1. (日本語訳)0: Scripting with the API"
連載のお礼と今後
元々この連載は、
それが、
これまで連載を続けてきて、
また、
全ての機能を紹介したわけではありませんが、
そこで一旦、
連載を続けているうちに、
これまでは隔週で連載を続けてきましたが、
これまで私のつたない説明に目を通していただきありがとうございました。そして今後もよろしくお願いいたします。
第7回 コンテナ型仮想化の情報交換会@大阪
6/