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

第23回 LXCの構築・活用[9]─ lxc-start-ephemeralとフック(1)

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

lxc-start-ephemeralのその他の使い方

コンテナ名の指定

デフォルトではlxc-start-ephemeralコマンドは,起動する一時的なコンテナの名前を,元のコンテナの名前の後に"-"(ハイフン)とランダムな文字列を続けた形で自動的に付与します。自動的に名前を生成させる代わりに-nオプションで名前を付けられます。

コマンドの実行

lxc-start-ephemeralコマンドはシステムコンテナだけでなく,アプリケーションコンテナも実行できます。アプリケーションコンテナを実行する場合は,実行したいコマンドを指定します。

$ sudo lxc-start-ephemeral -o ct01 -- /bin/hostname
ct01-d6cz_82i
$ sudo lxc-ls
ct01

以上の例は/bin/hostnameコマンドを実行しました。hostnameコマンドが実行されるとコンテナは終了しますので,lxc-lsコマンドで確認してもコンテナは存在しません。

$ sudo lxc-start-ephemeral -o ct01 -- /bin/bash
root@ct01-lk_clba7:~# (必要な処理を行う)
root@ct01-lk_clba7:~# exit
exit
$ sudo lxc-ls
ct01

以上の例はbashを実行しています。lxc-startで作成したコンテナの内部を,作成したコンテナを起動する前に確認する必要がある場合に便利かも知れませんね。こちらも必要な処理が終わりexitするとコンテナは消去されています。

コマンドを指定した場合,ホストOSのカーネルがlxc-attachコマンドが実行できる環境である場合はlxc-attachで実行した場合と同等の処理でコマンドを実行します。

lxc-attachコマンドが動かなような古いカーネルを使っているような場合は,ssh経由でコマンドが実行されます。この場合,後で説明するユーザやssh公開鍵をオプションで設定できます。

現時点でのマニュアルでは,コマンド実行はattachを使わずにssh経由で行われるという記載があります。しかしコードを確認してみると使用の可否を判断してどのようにコマンドを実行するかを決定しています。※1

※1)
筆者が送付したパッチがマージされましたので次のリリースで実際の動きに合った記述に修正されるはずです。

ユーザの指定

lxc-start-ephemeralでコマンドを実行する際に,そのコマンドを実行するユーザを指定できます。

もちろん,起動してくるコンテナでそのユーザが存在しており,そのユーザに対する必要な設定が行われている必要があります。

LXCのubuntuテンプレートやdownloadテンプレートでubuntuコンテナを作成した場合は,ubuntuユーザが作成されていますので,ubuntuユーザを指定してコマンドを実行してみましょう。ユーザを指定する場合は--userオプションを使います。

$ sudo lxc-start-ephemeral -o ct01 --user=ubuntu  -- /bin/bash
ubuntu@ct01-0d5di0mf:~$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),27(sudo)
ubuntu@ct01-0d5di0mf:~$ exit
exit
$ 

以上のように指定したubuntuユーザでbashが実行されていますね。存在しないユーザで実行すると,コマンドを実行してもエラーになりますからすぐにコンテナが終了します。

sshでアクセスする時は,--keyオプションを使ってユーザの公開鍵をコンテナ内にコピーできます。

ストレージタイプの指定

lxc-start-ephemeralコマンドは,先に説明したようにoverlayfsもしくはaufsを使って一時的なコンテナを作成します。先に紹介したpre-mountスクリプトでは,一時的なコンテナ用のデータはoverlayfsの上層側ディレクトリに保存されるように設定されていました。

この上層側ディレクトリをtmpfsで作成する代わりに,--storage-typeオプションでdirを指定して普通のディレクトリにできます。

もちろんコンテナの実行が終了した時点でコンテナ自体が消去される場合には,ストレージタイプでdirを指定してもtmpfsを指定してもあまり変わりはないように思えます。dirが選択肢にある理由は,後で説明する--keep-dataオプションで使うためです。

使用するUnion filesystemのタイプの指定

一時的なコンテナを作成する際に使用するUnion filesystemのタイプを--union-typeで指定できます。overlayfsaufsを指定できます。もちろん,指定したファイルシステムが使える環境である必要があります。

永続的なコンテナにする

--keep-dataオプションを付けてlxc-start-ephemeralコマンドを実行すると,コンテナ終了後にコンテナイメージを残せます。この場合,tmpfsを使うわけにはいきませんので普通にディレクトリを使います。

--keep-dataを使うと,lxc-cloneコマンドでoverlayfsもしくはaufsを使ったスナップショットクローンを指定した場合と同じような状態になりますね。

コンテナ内にホストのディレクトリをマウントする

ホスト上のディレクトリをコンテナ内にバインドマウントできます。これは--bdirオプションを使います。指定したパスと同じコンテナ内のパスにバインドマウントされます。

$ touch on_host
$ sudo lxc-start-ephemeral -o ct01 --user=ubuntu --bdir=/home/ubuntu -- /bin/bash
ubuntu@ct01-212j96rq:~$ pwd
/home/ubuntu
ubuntu@ct01-212j96rq:~$ ls
on_host

上記の例では,まず/home/ubuntu/on_hostというファイルを作成して,/home/ubuntuをバインドマウントする指定でコンテナを起動しています。コンテナ内の/home/ubuntuには確かにon_hostファイルがあります。

これは先に説明したlxc.hook.pre-mountを使ってマウントしています。

$ sudo cat /var/lib/lxc/ct01-212j96rq/pre-mount | grep bind
mount -n --bind /home/ubuntu /var/lib/lxc/ct01-212j96rq/rootfs//home/ubuntu

pre-mountスクリプトを確認してみると,以上のようにバインドマウントする行が存在します。

まとめ

今回は既に存在するコンテナの一時的なコピーを作成し,起動するlxc-start-ephemeralコマンドを紹介しました。また,lxc-start-ephemeralコマンドが処理中に使用しているLXCのフック機能を簡単に紹介しました。

次回は今回説明していないフック機能を紹介する予定です。

著者プロフィール

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

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

Plamo Linuxメンテナ

Twitter:@ten_forward
技術系のブログ:http://tenforward.hatenablog.com/