前回以来、コンテナに関する勉強会を東京で開催したり、その他の勉強会で登壇したりしていたので、気がつけば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
オプションが新設されました。
以上のようにオプションを指定しない場合、コンテナがバックグラウンドで起動しています。
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を起動しています。
コンテナ内のルートディレクトリを見るとinit.lxc.static
というスタティックリンクされたファイルが存在しています。そしてコンテナ内の/proc/mounts
を見ると、init.lxc.static
がマウントされていることが確認できます。
全コンテナをまとめて起動
lxc-autostart
コマンドは第25回で紹介した、複数のコンテナをまとめて起動したい場合に便利なコマンドです。まとめて起動したいコンテナを、lxc.group
を指定してグループ分けができます。
おさらいのためにUbuntu 14.04 LTS上の1.0.7で実行した例を見てみましょう。
"test"グループに設定されているコンテナを、以下のようにまとめて起動できました。
この場合、自動起動が設定されていても、"test"に属するコンテナのみ起動しました。グループ分けを無視して自動起動が設定されているコンテナをすべて起動するためには-a
オプションを使いました。
以上のように、自動起動が設定されているコンテナすべてが起動できています。しかし1.0系では、自動起動が無効になっているコンテナをまとめて起動できませんでした。
1.1では、新たに-A
オプションが新設され、lxc.start.auto
の指定を無視できるようになりました。以下のように-a
オプションと組み合わせて、システム上に存在するすべてのコンテナを起動できます。
以上のように、自動起動が設定されたコンテナだけでなく、自動起動がオフになっているコンテナも起動しています。
また、上記の実行例で示したように、lxc-ls
コマンドが表示するグループと自動起動の表示が分離して見やすくなっていますね。
lxc-lsの新しい出力項目
前述のようにlxc-ls
に"GROUPS"というカラムが新設された以外に、もう1つ表示できる項目が増えました。
以下のように--fancy-format
オプションに"interfaces"というキーワードが指定できるようになりました。コンテナ内のネットワークインターフェースを一覧できます。
上記の例では、"ct03"には2つのネットワークインターフェースが定義されています。
lxc-topコマンドのバイナリ化
1.0系ではluaで書かれていたlxc-top
コマンドが、1.1でC言語を使って書き直されました。
luaで書かれていたためか、Ubuntu 14.04 LTSではlxc-top
コマンドはパッケージでLXCを入れてもインストールされませんでした。一方、Ubuntu 15.04でインストールされるLXC 1.1系のパッケージではインストールされるようになっています。
コンテナ作成時にテンプレートの指定が必須に
1.0.7までではlxc-create
コマンドはコンテナ名を指定することのみが必須で、テンプレートを指定せずに実行すると、空のコンテナが作成されました。
1.1系では、-t
オプションを指定することが必須となりました。1.0.7まででテンプレートを指定せずに実行した場合と同じように、空のコンテナを作成したい場合は、-t none
のように指定します。
また1.0系でも、1.0.8でバグ修正として1.1と同じように-t
オプションが必須になりました。空のコンテナを作成する際には-t none
と指定をするのも同じです。
以上のようにコンテナディレクトリが作成され、ディレクトリには設定ファイルのみが作成されます。設定ファイルは以下のように作成時にコンテナに設定される、コンテナのデフォルト設定ファイルがコピーされただけの状態になっています。
ただし、Ubuntu 15.04にインストールされている1.1.2では、バグのために-t none
を指定してもエラーになるようです。
lxc-config lxc.cgroup.* の表示
第28回に「lxc-configの改良」で紹介したように、lxc-config
でcgroup関係のシステム設定が表示されるようになりました。
lxc-start-ephemeral --cdir オプション
第23回で説明した通り、lxc-start-ephemeral
コマンドは既存のコンテナの一時的なコピーを使ってコンテナを作成し、起動するコマンドです。
このコマンドのオプションにホスト上のディレクトリをコンテナ内にバインドマウントするための--bdir
というオプションがありました。
LXC 1.1では、--bdir
に加えて、バインドマウントでなく、ホスト上のディレクトリを下層側のディレクトリとして、コンテナ用に作成したディレクトリを上層側ディレクトリとしてoverlayfsでマウントするための--cdir
オプションが追加されました。
--bdir
だとホスト上に存在するディレクトリやファイルが直接操作されてしまいます。新しく追加された--cdir
を使うと、ホスト上のディレクトリやファイルをコンテナ内で使いたいけれども、変更はしたくない場合に使えます。
試してみましょう。
lxc-start-ephemeral
コマンドで起動するコンテナの元となるコンテナを作成します。そしてホスト上に/home/ubuntu/gihyo-test
というファイルを作りました。準備ができたので一時的なコンテナを起動しましょう。
上記の例のように--cdir /home
と指定して、ホストの/home
がコンテナ内でも見えるようにしています。起動したところでlxc-attach
コマンドでコンテナ内に入ってみます。
コンテナ内で/proc/mounts
を確認してみると、第23回で説明したように/
がoverlayfsでマウントされている以外に、--cdir /home
で指定した通り/home
がoverlayfsでマウントされていることがわかります。
コンテナ内の/home
を、下層ディレクトリとしてホストの/home
を使い、上層ディレクトリとしてコンテナディレクトリ内に作られたtmpfs内のdelta1
というディレクトリを使い、workdirとしてtmpfs内のwork1
を使い、overlayfsマウントして準備しているのがわかります。
コンテナ内で/home/ubuntu
を見てみると、確かにホスト上で作ったファイルが見えています。ここで新たにコンテナ内でファイルを作ってみましょう。コンテナ内では当然作成したファイルが見えていますね。
ここでホスト上で/home/ubuntu
を確認してみましょう。
上記のようにコンテナ内で作ったファイルはありません。コンテナ用の上層ディレクトリ内を確認してみると、以下のようにコンテナ内で作成したファイルが存在しています。
まとめ
今回はLXC 1.1の新機能や変更点のうち、主にコマンドの動きに関わる変更点を紹介しました。
次回も引き続きLXC 1.1の新機能や変更点を紹介します。