2017年1月11日水曜日

Ubuntu で lxc を試してみた

概要

勉強がてら lxc に触れてみました
バージョンによってエラーで動作しないケースがあったので、その辺も紹介します

環境

  • Ubuntu 14.04 (ホストマシン)
  • lxc 1.0.8-0ubuntu0.4

lxc のインストール

Ubuntu の場合パッケージが公開されているので、インストールは非常に簡単です

  • apt-get -y install lxc

インストールが完了すると lxc- というコマンドが使えるようになっています
lxc ではテンプレートと呼ばれるコンテナの雛形が準備されています
テンプレートは以下のディレクトリにあります

/usr/share/lxc/templates/

今回は ubuntu と centos テンプレートを使ってそれぞれのコンテナを起動してみます

Ubuntu コンテナの作成と起動

まずは ubuntu コンテナを起動してみます

  • lxc-create -t ubuntu -n ubuntu0

でコンテナを作成します、-n はコンテナの名前なので好きな名前を指定してください
いろいろとコンテナの作成処理が走るので待ちます
作成が完了するとログインユーザのユーザ名とパスワードが表示されると思います
デフォルトだと ubuntu/ubuntu でログインできるようです
では、コンテナを起動してみましょう

  • lxc-start -n ubuntu0 -d

で起動します
起動したらログインしてみます
コンテナのコンソール画面を起動するコマンドがあるので実行します

  • lxc-console -n ubuntu0

これでログイン画面が表示されると思います
先程の ubuntu/ubuntu でログインしてみましょう

コンソールをコンテナからデタッチしたい場合は「Ctrl + a, q」でデタッチできます
Ctrl + a が prefix キーになっているようなのでコンソール上でカーソルを先頭に合わせたい場合は Ctrl + a を 2 回押します
ちなみにコンテナとして作成した ubuntu は

  • Ubuntu 14.04.5 (jessie/sid)
  • Linux ubuntu0 3.16.0-30-generic

となっていました

CentOS コンテナの作成と起動

では次に CentOS コンテナを作成してみましょう
ほぼ手順は同じですが、ホストマシン上で yum コマンドが実行できないとダメなようでない場合はインストールしましょう

  • apt-get -y install yum

インストールできたらあとは ubuntu コンテナと同様の手順で作成、起動します

  • lxc-create -t centos -n centos0
  • lxc-start -n centos0 -d
  • lxc-console -n centos0

CentOS の場合デフォルトのログインユーザが root でパスワードがホストマシン上の /var/lib/lxc/centos0/tmp_root_pass に記載されているので確認してください
デタッチなどの方法は ubuntu と同様です

コンテナの CentOS の情報は以下の通りでした

  • CentOS release 6.8
  • Linux centos0.unassigned-domain 3.16.0-30-generic

その他よく使うコマンド

  • lxc-ls -f

コンテナの一覧がステータス付きで表示されます

  • lxc-stop -n centos0

コンテナを停止します
コンテナ上で shutdown コマンドを実行しても OK です

  • lxc-destroy -n centos0

コンテナを削除します

トラブルシューティング

いろいろとエラーも発生したので初回します

  • conf.c:instantiate_veth:2590 - failed to attach 'veth1SFGYW' to the bridge 'lxcbr0': Operation not permitted

エラーの文面は一部抜粋ですが、上記のエラーが発生しました
これは当初 Ubuntu16.04 で試そうとしておりそのときに発生し続けたエラーになります
自分は諦めて Ubuntu 14.04 を使うことで解決しました
また、その場合 lxc も 2.0.6 から 1.0.8 になりました
2 系はまだ不安定なのかもしれないです

  • conf.c:instantiate_veth:3105 - failed to attach 'vethJN8CV2' to the bridge 'lxcbr0': No such device

これはホストマシンを再起動してそのあとで lxc-start しようとしたら出たエラーになります
lxc はホストマシン上にブリッジアダプタ「lxcbr0」を作成して、それを使ってホストマシンとコンテナが通信をします
lxc-start するときにコンテナ用の仮想インタフェースを作成するようなのですが、ブリッジアダプタがそもそも作成されていない場合に該当のエラーが発生するようです
原因は不明だったのですが、手動でブリッジアダプタを作成することで解決できました

  • brctl addbr lxcbr0
  • ifconfig lxcbr0 10.0.3.1 netmask 255.255.255.0 up

毎回再起動するたびに実施しなければいけないのでブリッジ用のネットワーク設定ファイルを作成してもいいかもしれません
ubuntu なのでホストマシンの udev の設定周りが怪しそうだったのですが、詳細には調査しなかったので原因は不明です

最後に

lxc を Ubuntu 14.04 で試してみました
昔からある技術ではあるので、シンプルで使いやすい感じはしました

ただ、やはり docker に比べると機能的にも性能的にもだいぶ劣っちゃうかなという印象です用途が違うと言えばそれまでですが、コンテナを使ってアプリを動かしたいのが目的なのであれば docker で十分です

lxc には他にも cgroup と連携してリソース制限なども行えるようですがそれはまだ別の機会にでも試してみたいと思います

参考サイト

0 件のコメント:

コメントを投稿