前回までで、lxc-start-ephemeral
コマンドを紹介しましょう。
lxc-start-ephemeral
コマンドは、lxc-start-ephemeral
コマンドを実例にしてあわせて簡単に紹介したいと思います。
今回の例はUbuntu 14.
lxc-start-ephemeralコマンドの概要
lxc-start-ephemeral
コマンドは、
既存のコンテナをベースにいろいろな作業を行うには、lxc-clone
コマンドによるクローンが便利です。
一方、lxc-start-ephemeral
コマンドが便利な場面もあるでしょう。
また、lxc-start-ephemeral
コマンドはoverlayfsもしくはaufsを使用しますので、
まずは使ってみましょう
まずは簡単にlxc-start-ephemeral
コマンドの動きを見てみましょう。
lxc-start-ephemeral
コマンドを一番シンプルに使用するには、
以上のように実行するとフォアグラウンドでの起動になりますので、
あらかじめ-o
で指定したコピー元のコンテナにアクセスできるユーザが設定されていればそのまま使えますが、lxc-stop
で終了させるか、lxc-attach
コマンドで必要な設定や操作を行いましょう。
なおlxc-start
コマンドで起動したコンテナがデフォルトでバックグラウンド起動になるLXC 1.lxc-ephemeral
コマンドは特に指定しなければフォアグラウンドでの起動になります。
lxc-start
と同様に、lxc-start-ephemeral
でも-d
オプションを使ってバックグラウンドで起動できます。ここから後はバックグラウンドで起動していろいろな機能を紹介していきます。
それではバックグラウンドでコンテナを起動してみましょう。
バックグラウンドで起動すると、
もし、
lxc-console
コマンドを使ってログインする- ssh経由でログインする
lxc-attach
コマンドでコンテナ上でコマンドを実行する
一時的とは言え、lxc-ls
で確認できます。
起動を確認したあとコンテナを停止させてみます。
以上のように停止後はコンテナは消えています。
lxc-start-ephemeralコマンドのオプション
lxc-start-ephemeral
コマンドを詳しく見ていく前に、
オプション | オプションの説明 |
---|---|
-o,--orig | コピー元のコンテナ名 |
-n,--name | 一時的に起動するコンテナの名前 |
-d,--daemon | コンテナをバックグラウンドで実行 |
-b,--bdir | コンテナ内にバインドマウントするディレクトリ |
-u,--user | コンテナに接続するためのユーザ |
-S,--key | コンテナ内にコピーする SSH 公開鍵 |
-U,--union-type | 使用する union filesystem |
-k,--keep-data | コマンド終了後にコンテナイメージを残す |
-s,--storage-type | 使用するストレージバックエンド |
以上のオプションのうち、-o
のみです。--storage-type
は現時点でマニュアルに記載がありません。筆者がパッチを送ってありますので、
lxc-start-ephemeralコマンドの仕組みとフック
lxc-start-ephemeral
コマンドがどのように一時的なコンテナを実現しているのかを少し詳しく見ていきましょう。あらためてバックグラウンドでコンテナを起動してみます。
まずはコンテナ用のディレクトリを見てみましょう。
見慣れたファイルの他にいくつか初めて見るファイルが存在しますね。
まずは設定ファイルであるconfig
を見てみましょう。lxc-create
コマンドを使ってコンテナを作成した時にも設定される項目は除いて、lxc-start-ephemeral
特徴的な設定だけ挙げてみます。
lxc.
とlxc.
はlxc-start-ephemeral
コマンドがランダムで付与したコンテナ名で設定されています。この2つの設定以外が初めて目にする設定ではないでしょうか。
LXCはコンテナを起動させようとした時からコンテナが停止するまでのいろいろな場面と、lxc-start-ephemeral
コマンドはこのフックを使って必要な処理を行っています。
第11回、
まずはこの2つのフックについて説明しましょう。
lxc-start-ephemeralコマンドのコンテナ起動前の処理
lxc-start-ephemeral
コマンドは起動するコンテナのルートファイルシステムをunion filesystemを使って準備します。この準備をフックを使って行っています。
lxc.
は、
lxc.
で指定されているpre-mount
スクリプトは、
順に見ていきましょう。
- 2~4行目:変数の定義です。
- 5行目:
delta0
ディレクトリとrootfs
ディレクトリを作成します。 - 6行目:
rootfs
をtmpfsとしてマウントします。 - 7行目:上層側ディレクトリとして
delta0
を、下層側ディレクトリとしてコピー元であるコンテナのイメージを指定して rootfs
をoverlayfsとしてマウントします。 - 9行目:既に
configured
ファイルが存在する場合は10行目以下の処理を行いません。 - 10行目~15行目:コンテナのルートファイルシステム以下に存在しているファイルに記載されているホスト名を、
これから起動するコンテナ名で書き換えます。 - 16行目:
configured
ファイルを作成する。
という処理を行っています。
つまりoverlayfsが変化を記録するために使う上層側ディレクトリとしてtmpfsを使い、
overlayfsを使っているので、
lxc-start-ephemeralコマンドのコンテナ終了後の処理
lxc-start-ephmeral
コマンドを使って作成されたコンテナでは、
コンテナ終了後に後始末をするため、lxc.
という設定がされていました。これはコンテナがシャットダウンされた後にホストの名前空間上で実行されるフックです。
ここで指定されているファイルの中を見てみましょう。
一時的なコンテナ用に作成されたディレクトリを消去しています。このようにlxc.
を使って、
lxc-start-ephemeralのその他の使い方
コンテナ名の指定
デフォルトではlxc-start-ephemeral
コマンドは、-n
オプションで名前を付けられます。
コマンドの実行
lxc-start-ephemeral
コマンドはシステムコンテナだけでなく、
以上の例は/bin/
コマンドを実行しました。hostname
コマンドが実行されるとコンテナは終了しますので、lxc-ls
コマンドで確認してもコンテナは存在しません。
以上の例はbash
を実行しています。lxc-start
で作成したコンテナの内部を、exit
するとコンテナは消去されています。
コマンドを指定した場合、lxc-attach
コマンドが実行できる環境である場合はlxc-attach
で実行した場合と同等の処理でコマンドを実行します。
lxc-attach
コマンドが動かなような古いカーネルを使っているような場合は、
現時点でのマニュアルでは、
ユーザの指定
lxc-start-ephemeral
でコマンドを実行する際に、
もちろん、
LXCのubuntuテンプレートやdownloadテンプレートでubuntuコンテナを作成した場合は、ubuntu
ユーザが作成されていますので、ubuntu
ユーザを指定してコマンドを実行してみましょう。ユーザを指定する場合は--user
オプションを使います。
以上のように指定したubuntu
ユーザでbash
が実行されていますね。存在しないユーザで実行すると、
sshでアクセスする時は、--key
オプションを使ってユーザの公開鍵をコンテナ内にコピーできます。
ストレージタイプの指定
lxc-start-ephemeral
コマンドは、pre-mount
スクリプトでは、
この上層側ディレクトリをtmpfsで作成する代わりに、--storage-type
オプションでdir
を指定して普通のディレクトリにできます。
もちろんコンテナの実行が終了した時点でコンテナ自体が消去される場合には、dir
を指定してもtmpfs
を指定してもあまり変わりはないように思えます。dir
が選択肢にある理由は、--keep-data
オプションで使うためです。
使用するUnion filesystemのタイプの指定
一時的なコンテナを作成する際に使用するUnion filesystemのタイプを--union-type
で指定できます。overlayfs
かaufs
を指定できます。もちろん、
永続的なコンテナにする
--keep-data
オプションを付けてlxc-start-ephemeral
コマンドを実行すると、tmpfs
を使うわけにはいきませんので普通にディレクトリを使います。
--keep-data
を使うと、lxc-clone
コマンドでoverlayfsもしくはaufsを使ったスナップショットクローンを指定した場合と同じような状態になりますね。
コンテナ内にホストのディレクトリをマウントする
ホスト上のディレクトリをコンテナ内にバインドマウントできます。これは--bdir
オプションを使います。指定したパスと同じコンテナ内のパスにバインドマウントされます。
上記の例では、/home/
というファイルを作成して、/home/
をバインドマウントする指定でコンテナを起動しています。コンテナ内の/home/
には確かにon_
ファイルがあります。
これは先に説明したlxc.
を使ってマウントしています。
pre-mount
スクリプトを確認してみると、
まとめ
今回は既に存在するコンテナの一時的なコピーを作成し、lxc-start-ephemeral
コマンドを紹介しました。また、lxc-start-ephemeral
コマンドが処理中に使用しているLXCのフック機能を簡単に紹介しました。
次回は今回説明していないフック機能を紹介する予定です。