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

第29回 LXC 1.1[1]

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

前回以来,コンテナに関する勉強会を東京で開催したり,その他の勉強会で登壇したりしていたので,気がつけば3ヵ月も間隔が空いてしまいました。この勉強会ではLinuxコンテナの主要な機能である名前空間のカーネル内の実装のお話や,Docker関連のお話,Linux以外のコンテナ技術に関する話題も色々とお話いただいて,かなり面白い勉強会になりました。勉強会ページで一部の動画を公開していますので,興味のある方はぜひご覧ください。

この間に,この連載で何度も『次のリリースである1.0.8で修正されます』と言ったものの,さっぱりリリースされる気配のなかった1.0.8がようやくリリースされました。セキュリティホールの修正が含まれていますので1.0.7をお使いの方はバージョンアップをしてください。1.0.7から1年近く間隔が空いていますので,変更点が膨大です。変更点はlinuxcontainers.orgのNewsページに掲載されています。

さて,この連載では,これまでLXCの長期サポート版である1.0系列を取り上げて,機能を紹介してきました。

今回からはLXC 1.1を取り上げて,1.0からの変更点を中心に紹介していきたいと思います。

LXC 1.1は2015年1月末に1.1.0がリリースされ,執筆時点の現在では1.1.5が最新バージョンとなっています。

1.1で大きな新機能や改良が一段落し,1.1.0がリリースされたあとは,2015年2月に0.1がリリースされたLXDの方に大きく開発リソースが振り分けられているようで,それまでは毎日のように変化していたリポジトリにもたまにしかマージが行われなくなりました。

それではLXCが提供するコマンドで,新機能や使い方が変化した機能を中心に順に紹介していきたいと思います。

今回の実行例はUbuntu 15.04上にインストールしたLXC 1.1.2を使用しています。

lxc-startのデフォルト動作の変更

この変更については,第8回でも少し紹介しました。

1.0系ではlxc-startコマンドを使ってコンテナを起動させると,デフォルトではフォアグラウンドで起動しました。

動作確認を行う際などを除いて,実際にコンテナを起動させて使う場合にフォアグラウンドで起動させるケースはあまりないと思います。私も1.0系を使っていると,ついつい-dオプションの指定を忘れてしまい,フォアグラウンドで起動させてから「しまった」と思って,コンテナを起動しなおすケースが結構あります。

そこで1.1系ではlxc-startはバックグラウンド起動がデフォルトとなり,-dを付けなくても良くなりました。逆にフォアグラウンドで起動させる場合は-Fオプションを使います。1.0系でも,1.1以降への移行の際に問題にならないように,1.0.6で-Fオプションが新設されました。

$ lxc-start --version
1.1.2
$ sudo lxc-start -n ct01
$ sudo lxc-ls -f
NAME  STATE    IPV4        IPV6  GROUPS  AUTOSTART  
--------------------------------------------------
ct01  RUNNING  10.0.3.169  -     -       NO         

以上のようにオプションを指定しない場合,コンテナがバックグラウンドで起動しています。

1.0系を使っていて,シェルスクリプトなどでlxc-startを使い,オプションを指定せずにコンテナをフォアグラウンド起動させている場合は,1.1以降にバージョンアップする際に動作が変化しないように,-Fオプションを付けておくと良いでしょう。

アプリケーションコンテナ環境の構築が楽に

LXCでアプリケーションコンテナを実行する方法については第10回で説明しました。

そこで紹介した通り,アプリケーションコンテナを実行する場合はlxc-executeコマンドを使うと便利です。しかし,LXC 1.0系列でlxc-executeコマンドを使う場合は,init.lxcコマンドをコンテナ内に準備する必要があり少し不便です。init.lxcコマンドをコンテナ内にコピーするかバインドマウントをすれば良いものの,1.0のinit.lxcはダイナミックリンクされており,依存するライブラリも準備する必要があったためです。

1.1では,スタティックリンクされたlxc.initが準備され,コンテナ内にlxc.initが見つからない場合は,スタティックリンクされたlxc.initがコンテナ内にバインドマウントされます。このため,lxc.initを準備する必要はなくなり,単にlxc-executeを実行すれば良くなりました。ファイル名が少し変わって,ダイナミックリンクされたファイルはinit.lxcスタティックリンクされたファイルはinit.lxc.staticとなっています。

以下はinit.lxcを準備していないコンテナにインストールされたApacheを起動しています。

$ sudo lxc-execute -n ct02 -- /usr/sbin/apache2ctl start &
[1] 12505
$ sudo lxc-ls -f ct02
NAME  STATE    IPV4  IPV6  GROUPS  AUTOSTART  
--------------------------------------------
ct02  RUNNING  -     -     -       NO
$ sudo lxc-attach -n ct02 -- ls -F /    (/にinit.lxc.staticというファイルが存在する)
bin/   dev/  home/         lib/    media/  opt/   root/  sbin/  sys/  usr/
boot/  etc/  init.lxc.static*  lib64/  mnt/    proc/  run/   srv/   tmp/  var/
$ sudo lxc-attach -n ct02 -- file /init.lxc.static
/init.lxc.static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=ca82d892e89cb8f0e4fa60ad57b973172290e823, stripped
(init.lxc.staticファイルはスタティックリンクであることを確認)
$ sudo lxc-attach -n ct02 -- cat /proc/mounts | grep init.lxc
/dev/mapper/vivid--vg-root /init.lxc.static ext4 rw,relatime,errors=remount-ro,data=ordered 0 0
(マウントされていることを確認)

コンテナ内のルートディレクトリを見るとinit.lxc.staticというスタティックリンクされたファイルが存在しています。そしてコンテナ内の/proc/mountsを見ると,init.lxc.staticがマウントされていることが確認できます。

全コンテナをまとめて起動

lxc-autostartコマンドは第25回で紹介した,複数のコンテナをまとめて起動したい場合に便利なコマンドです。まとめて起動したいコンテナを,lxc.groupを指定してグループ分けができます。

おさらいのためにUbuntu 14.04 LTS上の1.0.7で実行した例を見てみましょう。

"test"グループに設定されているコンテナを,以下のようにまとめて起動できました。

$ sudo lxc-ls -f
NAME  STATE    IPV4  IPV6  AUTOSTART   
-------------------------------------
ct01  STOPPED  -     -     YES (test)  
ct02  STOPPED  -     -     YES (test)  
ct03  STOPPED  -     -     YES         
$ sudo lxc-autostart -g test 
$ sudo lxc-ls -f
NAME  STATE    IPV4        IPV6  AUTOSTART   
-------------------------------------------
ct01  RUNNING  10.0.3.228  -     YES (test)  
ct02  RUNNING  10.0.3.166  -     YES (test)  
ct03  STOPPED  -           -     YES         

この場合,自動起動が設定されていても,"test"に属するコンテナのみ起動しました。グループ分けを無視して自動起動が設定されているコンテナをすべて起動するためには-aオプションを使いました。

$ sudo lxc-ls -f
NAME  STATE    IPV4  IPV6  AUTOSTART   
-------------------------------------
ct01  STOPPED  -     -     YES (test)  
ct02  STOPPED  -     -     YES         
ct03  STOPPED  -     -     NO          
$ sudo lxc-autostart -a
$ sudo lxc-ls -f
NAME  STATE    IPV4        IPV6  AUTOSTART   
-------------------------------------------
ct01  RUNNING  10.0.3.228  -     YES (test)  
ct02  RUNNING  10.0.3.166  -     YES         
ct03  STOPPED  -           -     NO          

以上のように,自動起動が設定されているコンテナすべてが起動できています。しかし1.0系では,自動起動が無効になっているコンテナをまとめて起動できませんでした。

1.1では,新たに-Aオプションが新設され,lxc.start.autoの指定を無視できるようになりました。以下のように-aオプションと組み合わせて,システム上に存在するすべてのコンテナを起動できます。

$ sudo lxc-ls -f
NAME  STATE    IPV4  IPV6  GROUPS  AUTOSTART  
--------------------------------------------
ct01  STOPPED  -     -     test    BY-GROUP   
ct02  STOPPED  -     -     -       YES        
ct03  STOPPED  -     -     -       NO         
$ sudo lxc-autostart -a -A
$ sudo lxc-ls -f
NAME  STATE    IPV4        IPV6  GROUPS  AUTOSTART  
--------------------------------------------------
ct01  RUNNING  10.0.3.185  -     test    BY-GROUP   
ct02  RUNNING  10.0.3.224  -     -       YES        
ct03  RUNNING  10.0.3.242  -     -       NO         

以上のように,自動起動が設定されたコンテナだけでなく,自動起動がオフになっているコンテナも起動しています。

また,上記の実行例で示したように,lxc-lsコマンドが表示するグループと自動起動の表示が分離して見やすくなっていますね。

lxc-lsの新しい出力項目

前述のようにlxc-lsに"GROUPS"というカラムが新設された以外に,もう1つ表示できる項目が増えました。

以下のように--fancy-formatオプションに"interfaces"というキーワードが指定できるようになりました。コンテナ内のネットワークインターフェースを一覧できます。

$ sudo lxc-ls --fancy --fancy-format=name,state,ipv4,interfaces
NAME  STATE    IPV4                        INTERFACES      
---------------------------------------------------------
ct01  RUNNING  10.0.3.185                  eth0, lo        
ct02  RUNNING  10.0.3.224                  eth0, lo        
ct03  RUNNING  10.0.3.242, 10.200.200.239  eth0, eth1, lo  

上記の例では,"ct03"には2つのネットワークインターフェースが定義されています。

著者プロフィール

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

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

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

Twitter:@ten_forward
技術系のブログ:http://d.hatena.ne.jp/defiant/

コメント

コメントの記入