コマンドラインツール ¶
コマンドラインツールの使い方は Man ページ を参照してください。
API¶
LXC は C の API といくつかの言語のバインディングと共にリリースされています。API は同じバージョンでは不変で適切にバージョン管理されています。
LXC のリリースで liblxc1 には追加がなされることはあっても、API が削除されたり既存のシンボルが変更されることは liblxc2 になるまではありません。
安定版 API としてリリースされた最初の LXC のバージョンは LXC 1.0.0 でした。
lxccontainer.h にリストされているシンボルだけが API を構成します。その他全ては LXC の内部利用であり、いつでも変更される可能性があります。
C¶
前述の通り、lxccontainer.h が公開の C API です。
API の使用法の良い例にはバインディングと LXC のコマンドツール自身があります。
最新の git の master ブランチの最新の API ドキュメントは こちら にあります。
コンテナの作成、開始、停止、削除を行う API の使い方の簡単なサンプルをここであげておきましょう:
#include <stdio.h> #include <lxc/lxccontainer.h> int main() { struct lxc_container *c; int ret = 1; /* Setup container struct */ c = lxc_container_new("apicontainer", NULL); if (!c) { fprintf(stderr, "Failed to setup lxc_container struct\n"); goto out; } if (c->is_defined(c)) { fprintf(stderr, "Container already exists\n"); goto out; } /* Create the container */ if (!c->createl(c, "download", NULL, NULL, LXC_CREATE_QUIET, "-d", "ubuntu", "-r", "trusty", "-a", "i386", NULL)) { fprintf(stderr, "Failed to create container rootfs\n"); goto out; } /* Start the container */ if (!c->start(c, 0, NULL)) { fprintf(stderr, "Failed to start the container\n"); goto out; } /* Query some information */ printf("Container state: %s\n", c->state(c)); printf("Container PID: %d\n", c->init_pid(c)); /* Stop the container */ if (!c->shutdown(c, 30)) { printf("Failed to cleanly shutdown the container, forcing.\n"); if (!c->stop(c)) { fprintf(stderr, "Failed to kill the container.\n"); goto out; } } /* Destroy the container */ if (!c->destroy(c)) { fprintf(stderr, "Failed to destroy the container.\n"); goto out; } ret = 0; out: lxc_container_put(c); return ret; }
Python¶
python バインディングは、構造体に代わりに適切なオブジェクトがエクスポートされる部分を除いては、一般的に C API に最も近いです。
バインディングは 2 つの部分から作られています。生の (raw) "_lxc" C 拡張と、ユーザの使い勝手を改良する "lxc" python オーバーレイです。
"test" という名前のコンテナをロードするには以下のようにします:
import lxc container = lxc.Container("test")
便宜上、ネットワークはリストとしてアクセスします (変更の場合もそうです):
container.network[0].ipv4 = "10.0.3.50" container.network[0].ipv4_gateway = "10.0.3.1"
複数の値を持つ設定のエントリはリストで表現されます:
container.get_config_item("lxc.cap.drop") ['mac_admin', 'mac_override', 'sys_time', 'sys_module'] container.append_config_item("lxc.cap.drop", "net_admin") True container.get_config_item("lxc.cap.drop") ['mac_admin', 'mac_override', 'sys_time', 'sys_module', 'net_admin'] container.set_config_item("lxc.cap.drop", ["mac_admin", "mac_override"]) True container.get_config_item("lxc.cap.drop") ['mac_admin', 'mac_override'])
C の例と全く同じ例は以下のようになります:
#!/usr/bin/python3 import lxc import sys # Setup the container object c = lxc.Container("apicontainer") if c.defined: print("Container already exists", file=sys.stderr) sys.exit(1) # Create the container rootfs if not c.create("download", lxc.LXC_CREATE_QUIET, {"dist": "ubuntu", "release": "trusty", "arch": "i386"}): print("Failed to create the container rootfs", file=sys.stderr) sys.exit(1) # Start the container if not c.start(): print("Failed to start the container", file=sys.stderr) sys.exit(1) # Query some information print("Container state: %s" % c.state) print("Container PID: %s" % c.init_pid) # Stop the container if not c.shutdown(30): print("Failed to cleanly shutdown the container, forcing.") if not c.stop(): print("Failed to kill the container", file=sys.stderr) sys.exit(1) # Destroy the container if not c.destroy(): print("Failed to destroy the container.", file=sys.stderr) sys.exit(1)
python バインディングの大きな特徴は、以下の全てのコンテナを更新するスクリプトの例でわかるように、コンテナのコンテキスト内で関数を実行できることです:
#!/usr/bin/python3 import lxc import sys for container in lxc.list_containers(as_object=True): # Start the container (if not started) started = False if not container.running: if not container.start(): continue started = True if not container.state == "RUNNING": continue # Wait for connectivity if not container.get_ips(timeout=30): continue # Run the updates container.attach_wait(lxc.attach_run_command, ["apt-get", "update"]) container.attach_wait(lxc.attach_run_command, ["apt-get", "dist-upgrade", "-y"]) # Shutdown the container if started: if not container.shutdown(30): container.stop()