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

第8回 LXCの基本操作[1]

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

コンテナの停止・リブート ~ 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オプションを使います。

$ sudo lxc-stop -n ct01
$ sudo lxc-ls --fancy
NAME      STATE    IPV4  IPV6  AUTOSTART  
----------------------------------------
ct01      STOPPED  -     -     NO

lxc-stopコマンドは,デフォルトではコンテナの停止を待ってからコマンドを終了します。

コンテナのリブート

コンテナのリブートをlxc-stopコマンドを使って行うには-r / --rebootオプションを指定します。

コンテナの停止と同様で,リブートの場合もlxc-stopコマンドはコンテナのinitに対してシグナルを送出します。送出するシグナルはSIGINTです。

コンテナのinitSIGINTを受け取った時の設定がされていなければリブートしないのも停止の場合と同様です。一般的には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の中が見たいのであれば,以下のようにすれば良いだけです。

$ sudo tail -n 1 -f /var/lib/lxc/ct01/rootfs/var/log/syslog 
Aug 13 15:35:31 ct01 dhclient: bound to 10.0.3.92 -- renewal in 1399 seconds.

難しく考える必要はありませんね。(^_^)

lxc-console

lxc-consoleは指定したコンテナのコンソールにアクセスします。もちろん,コンテナの設定ファイル,コンテナ内の両方できちんとコンソールの設定がされている必要があります。

$ sudo lxc-console -n ct01

Connected to tty 1
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

上記のように実行すると,コンソールが起動します。

Ubuntu 14.04.1 LTS ct01 tty1

ct01 login: ubuntu
Password: 
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-33-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

ubuntu@ct01:~$ uname -a
Linux ct01 3.13.0-33-generic #58-Ubuntu SMP Tue Jul 29 16:45:05 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
ubuntu@ct01:~$

これで通常のコンソールログインしたのと同様にコンテナ内で作業ができます。Ctrl+a に続いて q とタイプするとこのコンソールから抜けられます。

ログインした状態でコンソールから抜けて,再度lxc-consoleを実行すると,当然ですがログインした状態のコンソールにつながります。

Ctrl+a-e / --escapeオプションで別の文字に置換できます。

$ sudo lxc-console -n ct01 -e '^b'

Connected to tty 1
Type <Ctrl+b q> to exit the console, <Ctrl+b Ctrl+b> to enter Ctrl+b itself

Ctrl+aがCtrl+bに変わっていますね。

テンプレートを使って作成したコンテナであれば,コンソールの設定は済んでいることが多いでしょうから,コンテナにログインして作業を行いたい場合にlxc-consoleを使って気軽に作業が行えますね。

ただし,lxc-consoleはコンソールですから,対話的にコマンドを実行するような場合でしか使えません。ホスト上からコンテナの管理をする場合は,対話的にコマンドを実行するだけでなく,管理用のスクリプトを実行する場合も多いと思います。そういう場合はsshを使うか,この後説明するlxc-attachを使う必要があります。

lxc-attach

lxc-attachはホストOSからコンテナ内で直接コマンドを実行するためのコマンドです。正確にいうと,ホストOSからコンテナの名前空間内で直接コマンドを実行するコマンドです。

第2回で説明したとおり,コンテナはホストOS上で専用の名前空間を作成して,ホストOSや他のコンテナから隔離した空間を作成することによって実現しています。

ホストOSは各コンテナがどの名前空間で実行されているかは知っていますから,その名前空間の中に入り込んでコマンドを実行できます。この機能を使ってコンテナ内で直接コマンドを実行するのがlxc-attachです。

言葉で言うと難しいですね。例を見てみましょう。

$ sudo lxc-start -n ct01 -d
$ sudo lxc-ls --fancy ct01
NAME  STATE    IPV4       IPV6  AUTOSTART  
-----------------------------------------
ct01  RUNNING  10.0.3.92  -     NO

以上のようにコンテナを起動し,起動したことを確認します。

lxc-attachコマンドを使ってhostnameコマンドとipコマン ドを実行してみましょう。

$ sudo lxc-attach -n ct01 -- hostname
ct01
$ sudo lxc-attach -n ct01 -- ip addr show eth0
50: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:54:1f:bd brd ff:ff:ff:ff:ff:ff
    inet 10.0.3.92/24 brd 10.0.3.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe54:1fbd/64 scope link 
       valid_lft forever preferred_lft forever

以上のようにコンテナに設定されているホスト名,IPアドレスが表示されています。

ここでシェルを実行すると,ログインせずにsshやlxc-consoleでログインしたのと同じような操作にみえますね。

$ sudo lxc-attach -n ct01 -- /bin/bash
root@ct01:/#

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が持っているいろいろな便利なコマンドについて説明したいと思います。その後の回で設定ファイルの説明を行う予定です。

著者プロフィール

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

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

Plamo Linuxメンテナ

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