今回からはLXCの基本的なコマンドを使ったコンテナの操作を、Ubuntu 14.04 LTSを使って説明していきたいと思います。
ここではUbuntu 14.04 LTSでパッケージインストールしたlxc-1.0.5を使ってLXCコンテナの基本的な操作を紹介していきます。1.0系であれば操作に変化はありません。0.9以前の古いバージョンや開発中のgithubのmasterブランチの場合は操作や出力が違うかもしれません。
Ubuntuパッケージ使用時の各種パス
最初にUbuntuのLXCパッケージを使用した場合の各種ファイルやディレクトリのパスを紹介しておきます。他のディストリビューションでは異なる可能性がありますし、LXCをソースからコンパイルした場合はコンパイル時の指定で変わります。
表1 Ubuntu LXCパッケージにおけるファイル/ディレクトリのパス
ファイル/ディレクトリ | パス |
システム設定ファイル | /etc/lxc/lxc.conf |
コンテナのデフォルト設定ファイル | /etc/lxc/default.conf |
テンプレートファイルの置き場所 | /usr/share/lxc/templates |
コンテナ起動時に読み込まれるファイルの置き場所 | /usr/share/lxc/config |
コンテナ作成時のキャッシュの置き場所 | /var/cache/lxc |
コンテナの保存場所 | /var/lib/lxc |
ログファイルの出力場所 | /var/log/lxc |
表に出てくるファイルやディレクトリでこれまで説明がなかったものについて説明します。
- システム設定ファイル
- この後説明するコンテナの保存場所のパス、コンテナの設定ファイルの場所、ストレージバックエンド使用時のデフォルト値などの、システム共通で使用するデフォルト値を指定したい場合にファイルを作成して値を設定します。ファイルが存在しない場合はコンパイル時の値が使用されます。
- コンテナのデフォルト設定ファイル
- コンテナを作成する時に共通して設定したいものを記載しておきます。コンテナ作成時にこのファイルの設定値がコンテナの設定ファイルにコピーされます。
- コンテナ起動時に読み込まれるファイル
- テンプレートを使ったコンテナの作成で生成されるコンテナの設定ファイルは、各ディストリビューションのデフォルト設定を読み込む(includeする)設定が書き込まれます。そのディストリビューションごとのデフォルト設定が書かれたファイルが
/usr/share/lxc/config
に置かれています。コンテナの起動時に、includeされたこのファイルに書かれた設定を読み込みます。
- コンテナ作成時のキャッシュ
- テンプレートはキャッシュを使ってコンテナの作成時間を短縮することがあります。キャッシュについてはコンテナ作成のところで説明します。
- コンテナの保存場所
- コンテナイメージとコンテナごとの設定ファイル、つまりコンテナそのものを置く場所です。コンテナの作成時や起動時に特に指定しなければ、このディレクトリ(
/var/lib/lxc
)を使用します。このディレクトリ以下をどのように使うかは後ほど、作成したコンテナの確認を行うところで説明します。
- ログファイル
- コンテナごとにログファイルが出力されます。特に出力するログファイルを指定しなければ
/var/log/lxc
以下に(コンテナ名).log
というファイルが作成されます。
Ubuntu上でLXCパッケージ使った時のコンテナ用のネットワーク
LXCで提供されているコマンドを使った説明に入る前に、もうひとつUbuntuでLXCパッケージをインストールした場合に依存する話をしておきます。LXCパッケージをインストールすると、コンテナ用のネットワークが設定されます。
ホストOSの起動時にコンテナを接続するためのブリッジとしてlxcbr0
が作成されます。コンテナ用のネットワークとしてはデフォルトで10.0.3.0/24が設定され、lxcbr0には10.0.3.1が割り当てられます。
コンテナにDHCPでIPアドレスを割り当て、コンテナが名前解決ができるようにdnsmasqが起動します。
また、図1のようにホストが接続されているネットワークとコンテナ用のネットワーク(10.0.3.0/24)の間にはNATが設定されますので、ホストOS経由で外部との通信ができるようになります。
ブリッジの名前やコンテナ用のネットワークのアドレスは、コンテナ用のネットワークの設定ファイル/etc/default/lxc-net
に設定されていますのでこのファイルを編集して変更できます。
コンテナのデフォルト設定ファイル(/etc/lxc/default.conf
)には、このようにして作られたネットワークを使用するための設定が書かれています。この設定はコンテナを作成する際にコンテナの設定ファイルにコピーされます。このファイルは以下のような内容です。
この内容がコピーされている様子はこの後のコンテナを作成する所で紹介します。設定ファイル内の設定については、この連載の後の回でコンテナの設定について紹介するところで説明します。
共通オプション
それではいよいよコマンドを使ったコンテナの操作の説明をしていきましょう。
LXCではlxc-
で始まるコンテナに対する操作や管理を行うコマンド群が提供されています。最初にこのコマンド群のほとんどで共通して使えるオプションを紹介しておきましょう。
表2 LXCの共通オプション
オプション | オプションの意味 |
-h / --help | ヘルプの表示 |
--usage | コマンドの使いかたの表示 |
-q / --quiet | 画面出力の抑止 |
-P / --lxcpath | コンテナの保存場所 |
-o / --logfile | コンテナのログファイルのパス |
-l / --logpriority | ログのプライオリティ |
-n / --name | コンテナの名前 |
ここで紹介したオプションはほとんどのLXCコマンドで使用できますが、コマンドによっては使えないオプションもあります。詳しくはオンラインマニュアルを参照してください。
-n
/--name
オプションはほとんどのコマンドで必要なコンテナ名を指定するオプションです。ほとんどのコマンドで必要にもかかわらず、オプションで指定する必要があります。
-P
/--lxcpath
はデフォルトと違うパスにコンテナを設置する場合に使いますが、デフォルトの場所を使う場合は特に指定する必要はありません。
コンテナの作成 ~ lxc-create
まずはコンテナの作成です。コンテナの作成にはlxc-create
コマンドを使用します。
表3 lxc-createのオプション
オプション | オプションの説明 |
-f | コンテナの設定ファイルにコピーする設定が書かれたファイル |
-t | テンプレート名 |
-B | バックエンドストレージの形式 |
作成したいコンテナに応じて-t
オプションでテンプレートを選択します。たとえば-t ubuntu
と指定すると、テンプレートファイルの置き場所にあるlxc-ubuntu
というファイルがテンプレートとして使われます。
ubuntuコンテナの作成
最初にUbuntuテンプレートを使ってコンテナを作成してみましょう。
Ubuntuテンプレートを使うと、以上のようにdebootstrap
を使ってコンテナのイメージ作成が始まります。ダウンロードしたパッケージとパッケージを展開したファイルはキャッシュされます。次回同じバージョンのコンテナを作る場合、更新されているパッケージ以外はダウンロードしませんので、作成にかかる時間は速くなります。
Ubuntu以外のほとんどテンプレートでもキャッシュを使います。しかしキャッシュを使うかどうか、どのようにキャッシュを使うかはテンプレート次第です。
テンプレートオプション
lxc-ubuntu
などのディストリビューションのテンプレートを使う場合、テンプレートのオプションは特に指定しなくてもコンテナは作成できます。
しかしダウンロードテンプレートを使う場合は、どのイメージをインストールするのかを指定する必要があります。このようにテンプレートの動作を指定する時使うのがテンプレートオプションです。
ダウンロードテンプレート以外のテンプレートでも、各テンプレートの持つオプションを使って細かく設定できます。
テンプレートオプションを指定するには、lxc-create
自身の持つオプションを指定した後に--
を指定し、その後にテンプレートが持つオプションを指定します。
テンプレートが持つオプションを調べるには、以下のように-t
オプションでテンプレートを指定して-h
オプションを指定します。
ダウンロードテンプレートを使ったコンテナの作成
ダウンロードテンプレートを使い、以上で調べたオプションを指定してコンテナを作成してみましょう。テンプレートオプションとして最低限設定する必要があるのはディストリビューション、リリース、アーキテクチャです。
amd64アーキテクチャのUbuntu trustyコンテナイメージをダウンロードして作成するには以下のように実行します。
このように実行すると、LXCのダウンロード用サーバからイメージをダウンロードしてコンテナを作成します。
ただしダウンロードテンプレートは、テンプレートオプションを指定しなくても、不足しているオプションは問い合わせてくれるように作られています。
ダウンロードテンプレートでも、ダウンロードしたコンテナイメージはキャッシュされます。次回、同じコンテナイメージを使ってコンテナを作成する場合は、コンテナイメージの更新がなければキャッシュされたイメージを使用します。
作られたコンテナの確認
lxc-create
コマンドの実行で作られたコンテナのファイルや設定ファイルを少し見ておきましょう。先のダウンロードテンプレートで作ったct01
コンテナを例にあげます。
コンテナの設定ファイルとイメージはコンテナの保存場所ディレクトリ直下にコンテナ用ディレクトリを作成して、そこに保存されます。
Ubuntuの場合、保存場所は/var/lib/lxc
ですから、ct01
コンテナのファイルは/var/lib/lxc/ct01
以下に保存されます。
ここにあるrootfsディレクトリがコンテナの/(ルート)となります。
/var/lib/lxc/ct01/config
はct01
の設定ファイルです。内容は以下のようになっています。最後の4行は、先に紹介したコンテナのデフォルト設定ファイルdefault.conf
の内容がコピーされています[1]。
設定ファイルについてはこの連載の後の回で紹介します。
ホストOSのディストリビューションと指定するテンプレートの関係
ここではUbuntu上でUbuntuテンプレートとダウンロードテンプレートを使ってコンテナを作りました。
ダウンロードテンプレートは多くの環境にインストールされている基本的なコマンドを使ってコンテナイメージを展開しますので、ホストOSがどのような環境であっても問題なく使えることが多いでしょう。
また、ホストOSのディストリビューションと同じディストリビューションのコンテナを作成するテンプレートを使った場合も、コンテナ作成に必要なコマンドが含まれたパッケージがインストールされていれば問題なく作成できます。必要なコマンドがインストールされていない場合でも、パッケージを追加でインストールすれば済みます。
では、ホストOSのディストリビューションと異なるディストリビューションのコンテナを作成するテンプレートを使う場合はどうでしょう。
ホストOSのディストリビューションにかかわらず、lxc-create
を実行するときは任意のテンプレートを指定できます。しかし、テンプレート内で使っているコンテナ作成に必要なコマンドが、ホストOS上にインストールされていない場合はコンテナは作成できません。
たとえばyumやrpmコマンドがないのにyumを使ってパッケージをインストールするlxc-centos
を使ってCentOSコンテナは作成できません。
ホストOSのディストリビューションと異なるディストリビューションのテンプレートを使う場合は、コンテナの作成に必要なコマンドを含むパッケージ自体がホストOSのディストリビューションに用意されていないこともあるため、コンテナが作成できないケースも多いでしょう。
コンテナの情報表示 ~ lxc-ls, lxc-info
コンテナを作成したところで、コンテナの情報を表示させてみましょう。現在、ホスト上に存在するコンテナの一覧を表示するにはlxc-ls
を使います。
以上のようにコンテナの一覧を表示するだけでなく、コンテナの稼動状態を簡易的に表示できます。
以上のようにデフォルトではコンテナ名、状態、IPv4アドレス、IPv6アドレス、ホスト起動時の自動起動が設定されているかどうかを表示します。
--fancy
オプションで表示させる項目は--fancy-format
オプションにカンマ区切りで表示させたい項目を指定して変更できます。
この例では、指定可能な項目名を全て指定してみました。
なお、lxc-ls
は前回説明した通り、Python3バインディングを使って実装されていますので、Python3がない環境では動かないか、0.8.0まで存在していたシェルスクリプトのlxc-ls
がインストールされているかもしれません。
その場合は以上のような詳細な情報の表示はできませんので、以下で説明する単独のコンテナの情報を表示させるlxc-info
というコマンドを使います。こちらはC言語で実装されています。
lxc-ls
より少し表示できる情報が多く、コンテナの設定も表示できます。
設定を表示させる機能については、LXCの設定ファイルはテキストですから直接見ればよいので、あまり使うことはないかもしれませんね。
なお、lxc.network.*
の設定値を表示させる場合は少し使い方に注意が必要です。
という設定がある場合、設定ファイルのキーをそのまま指定すると、
となってしまいます。これはコンテナ用に複数のネットワークインターフェースを定義できるためです。上の例でちゃんと値を表示させるためには、
という風にnetwork
の後に0から始まる数字を指定しなければいけません。内部の配列の添字をそのまま使っている感じですね。
なお、lxc-info
も1.0より古いバージョンでは表示できる情報が少なく、コンテナの状態とコンテナのinitのPIDが表示できるだけです。
コンテナの情報表示を行うコマンドを2つ紹介しました。筆者は、バックグラウンド実行のコンテナの簡単な動作確認であれば、コンテナ名の指定の要らないlxc-ls
をよく使います。
コンテナの起動 ~ lxc-start
コンテナの存在や状態の確認ができるようになったところでいよいよコンテナを起動してみましょう。
連載のこれまでの回で少し紹介したように、コンテナの起動にはlxc-start
コマンドを使用します。起動の前に主なオプションを確認しておきましょう。
表4 lxc-startの主なオプション
オプション | 意味 |
-d / --daemon | デーモンモードで起動 |
-f / --rcfile | 設定ファイルの指定 |
-s / --define | 設定の指定 |
-d
を付けないと、lxc-start
はフォアグラウンドで起動しますので、起動したターミナル上にコンソールが開きます。コンテナ作成直後にコンテナが起動するかどうか確認したい場合はログなどが出力されて便利ですが、実際にコンテナを利用する場合には毎回-d
を付けなければいけないので少し不便ですね。
次のバージョン(1.1)ではフォアグラウンド起動用のオプションが新設され、-d
のデーモンモードがデフォルトになる予定です。現在のバージョンである1.0系列でも互換性のために-F / --foreground
というオプションが新設される予定です。
デフォルトの場所にある設定ファイル以外の設定ファイルを指定したい場合は-f / --rcfile
を指定します。
また、特定の設定値を起動時に設定したい場合は-s / --define
を使用します。このオプションは設定ファイルに同じ設定がある場合でも設定ファイルの値を上書きします。
この他にもオプションがありますので、詳しくはman lxc-start
で確認してください。
それでは起動してみましょう。
以上のようにフォアグラウンドで起動すると、通常のOS起動時のような出力が表示された後にログインプロンプトが表示されます。
コンテナの起動に問題がある時はLXCのエラーが出力されることがあります。しかし、問題解決に十分な情報がでない場合が多いので詳しくエラーの中身を見たい場合は共通オプションにあったログ出力を指定しましょう。
このように起動するとlogfile
というファイルにDEBUG
レベル以上のログが出力されます。
コンテナが起動することが確認できればバックグラウンドで起動すれば良いでしょうから、-d
オプションを付けて起動します。
コンテナの停止・リブート ~ lxc-stop
システムコンテナの停止やリブートを行いたい場合は、通常のホストのシャットダウンと同様にコンテナ内からシャットダウン操作を行えばコンテナは停止しますし、リブート操作を行えばコンテナはリブートします。
加えて、コンテナ内での操作でなく、ホストOS上からもlxc-stop
コマンドを使ってコンテナを停止したりリブートしたりできます。
表5 lxc-stopコマンドのオプション
オプション | オプションの説明 |
-r / --reboot | コンテナのリブート |
-k / --kill | シャットダウンの代わりにコンテナを強制終了する |
-t / --timeout | タイムアウト時間の指定 |
上記がlxc-stop
の主なオプションです。これ以外のオプションはman lxc-stop
で確認してください。
コンテナの停止
lxc-stop
コマンドは、コンテナのinit
に対してSIGPWR
シグナルを送出します。その後デフォルトでは60秒以内にコンテナのシャットダウンが終了しない場合はSIGKILL
を送出してコンテナを強制終了させます。この60秒を変更したい場合は-t
オプションを使います。
このようにコンテナのinitに対してシグナルを送出するだけですので、指定したシグナル(デフォルトでPIGPWR
)を受け取ったときにシャットダウンが行われるように設定されていなければ、コンテナ内では正常なシャットダウン処理が行われませんので注意が必要です。
送出するシグナルは設定ファイルで指定できます。init
が起動しないアプリケーションコンテナの場合もSIGTERM
を設定するなど、コンテナに応じて設定できます。
ホストOS上でシグナルを指定してkill
コマンドを実行してもlxc-stop
と同様にコンテナが停止できます。しかし、シャットダウンに失敗した時の処理が指定できたり、LXCのAPI廻り独特の必要な処理も同時になされる可能性が高いので、素直にlxc-stop
を使うのが良いでしょう。
コンテナへのシャットダウンの指示を行わずにいきなり強制停止したい場合は-k
オプションを使います。
lxc-stop
コマンドは、デフォルトではコンテナの停止を待ってからコマンドを終了します。
コンテナのリブート
コンテナのリブートをlxc-stop
コマンドを使って行うには-r / --reboot
オプションを指定します。
コンテナの停止と同様で、リブートの場合もlxc-stop
コマンドはコンテナのinit
に対してシグナルを送出します。送出するシグナルはSIGINT
です。
コンテナのinit
でSIGINT
を受け取った時の設定がされていなければリブートしないのも停止の場合と同様です。一般的にはinit
ではCtrl+Alt+Delキーを押した時の動作として設定されていますね。
コンテナのリブートも、停止と同様にタイムアウト時間(デフォルトは60秒)が設定されています。この時間内にリブートが成功しなければエラーメッセージが出力されます。コンテナの終了とは違い、リブートが失敗してもコンテナに対して強制終了などの追加の処理がされることはありません。
コンテナ内での作業
これでコンテナの起動、停止と稼働確認ができるようになりました。そうなると次はコンテナ内での作業ですね。これにはいくつか方法があります。
ssh
すぐに思い浮かぶのはコンテナにssh経由で接続することですね。ホストOSへのアクセス権がなく、コンテナへはリモートからのみアクセス可能であれば普通はsshでアクセスすることになるのは、通常のホストへのアクセスや仮想マシンへのアクセスと同じです。
コンテナ内でsshdが起動するように設定されていて、アクセス制限がかかっていないようであれば、コンテナ起動後にすぐにsshで接続ができます。しかしコンテナ内での設定が足りない場合でsshdが起動していない場合は、この後説明する方法でホストOS上からコンテナへアクセスし、コンテナ内の設定を行ってからアクセスします。
sshでアクセスする場合、特にコンテナ特有の話はありません。
ここで少し考えてみてください。ホストOSにアクセスできて、ホストOS上からコンテナにssh以外の方法でアクセスできるのであれば、何らかの理由でsshを使わなければならない場合をのぞいては、sshで接続する意味はなくなりますね。以降ではssh以外のコンテナの特長を活かした方法を紹介しましょう。
ログへのアクセスや設定ファイルの更新
ここまでで説明したとおり、コンテナのイメージは単にホストOS上のディレクトリであることが多いので、ホストOS上のファイルを見るのと同じようにコンテナ内のファイルを扱えます。
コンテナへのアクセスの目的がログを見たいとか、設定ファイルを更新したいのであれば単にホスト上でcd
コマンドでディレクトリを移動すれば、目的のファイルにたどり着けますし、直接フルパスで指定すればコンテナ内のファイルへアクセスできます。
ログを見たり、設定ファイルを編集するだけであれば、この方法が一番単純ですね。
たとえば、先の例のct01
コンテナ内の/var/log/syslog
の中が見たいのであれば、以下のようにすれば良いだけです。
難しく考える必要はありませんね。(^_^)
lxc-console
lxc-consoleは指定したコンテナのコンソールにアクセスします。もちろん、コンテナの設定ファイル、コンテナ内の両方できちんとコンソールの設定がされている必要があります。
上記のように実行すると、コンソールが起動します。
これで通常のコンソールログインしたのと同様にコンテナ内で作業ができます。Ctrl+a に続いて q とタイプするとこのコンソールから抜けられます。
ログインした状態でコンソールから抜けて、再度lxc-console
を実行すると、当然ですがログインした状態のコンソールにつながります。
Ctrl+a
は-e / --escape
オプションで別の文字に置換できます。
Ctrl+aがCtrl+bに変わっていますね。
テンプレートを使って作成したコンテナであれば、コンソールの設定は済んでいることが多いでしょうから、コンテナにログインして作業を行いたい場合にlxc-console
を使って気軽に作業が行えますね。
ただし、lxc-console
はコンソールですから、対話的にコマンドを実行するような場合でしか使えません。ホスト上からコンテナの管理をする場合は、対話的にコマンドを実行するだけでなく、管理用のスクリプトを実行する場合も多いと思います。そういう場合はsshを使うか、この後説明するlxc-attach
を使う必要があります。
lxc-attach
lxc-attachはホストOSからコンテナ内で直接コマンドを実行するためのコマンドです。正確にいうと、ホストOSからコンテナの名前空間内で直接コマンドを実行するコマンドです。
第2回で説明したとおり、コンテナはホストOS上で専用の名前空間を作成して、ホストOSや他のコンテナから隔離した空間を作成することによって実現しています。
ホストOSは各コンテナがどの名前空間で実行されているかは知っていますから、その名前空間の中に入り込んでコマンドを実行できます。この機能を使ってコンテナ内で直接コマンドを実行するのがlxc-attach
です。
言葉で言うと難しいですね。例を見てみましょう。
以上のようにコンテナを起動し、起動したことを確認します。
lxc-attach
コマンドを使ってhostname
コマンドとip
コマン
ドを実行してみましょう。
以上のようにコンテナに設定されているホスト名、IPアドレスが表示されています。
ここでシェルを実行すると、ログインせずにsshやlxc-consoleでログインしたのと同じような操作にみえますね。
lxc-attach
自身のオプションとlxc-attach
を使って実行するコマンドをきちっと分離するために、lxc-attach
のオプションを指定した後に--
を与えて、その後に実行したいコマンドを指定します。
lxc-attach
にはたくさんのオプションがありますが、通常はコンテナ名と実行したいコマンドを指定するだけでやりたいことはできると思います。その他のオプションについてはman lxc-attach
を実行して確認してください。
lxc-attach
を使えば、コンテナ上でsshdが動いてなくても、ホストOS上からコンテナ内でコマンドを実行して、コンテナの管理ができるので便利です。また、コンテナ内でいろいろなデーモンが動作していないアプリケーションコンテナの場合でもコンテナ内でいろいろな操作を行えて便利ですね。
名前空間を使って隔離された空間を作成しているだけ、というコンテナならではの特長を活かしたコマンドだと思います。
lxc-attach
は便利なコマンドですが、一点だけ注意が必要です。ここで実行例として使っているUbuntu 14.04 LTS環境であれば何も問題はありませんが、lxc-attach
はバージョン3.8以上のカーネルが必要です。比較的新しい環境でしか動作しませんので、それ以外の環境ではssh経由で作業を行うか、lxc-console
を使う必要があります。
まとめ
今回はコンテナの基本的な操作を中心に説明しました。これでコンテナを作成して、起動させてから停止させるまで一通りの操作はできるようになったと思います。
コンテナ内での作業は、ついついsshで接続して作業したいと考えてしまいがちですが、コンテナの場合は仮想マシンにはない特長がありますので、やりたいことをよく考えて方法を選択していただければと思います。
次回もLXCが持っているいろいろな便利なコマンドについて説明したいと思います。その後の回で設定ファイルの説明を行う予定です。