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

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

今回からは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パッケージをインストールすると、コンテナ用のネットワークが設定されます。

図1 Ubuntu LXCパッケージのコンテナネットワーク
図1 Ubuntu 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に設定されていますのでこのファイルを編集して変更できます。

$ cat /etc/default/lxc-net | grep -v "^#"
USE_LXC_BRIDGE="true"

LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"

コンテナのデフォルト設定ファイル/etc/lxc/default.confには、このようにして作られたネットワークを使用するための設定が書かれています。この設定はコンテナを作成する際にコンテナの設定ファイルにコピーされます。このファイルは以下のような内容です。

$ cat /etc/lxc/default.conf 
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx

この内容がコピーされている様子はこの後のコンテナを作成する所で紹介します。設定ファイル内の設定については、この連載の後の回でコンテナの設定について紹介するところで説明します。

共通オプション

それではいよいよコマンドを使ったコンテナの操作の説明をしていきましょう。

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テンプレートを使ってコンテナを作成してみましょう。

$ sudo lxc-create -n ubuntu01 -t ubuntu
Checking cache download in /var/cache/lxc/trusty/rootfs-amd64 ... 
Installing packages in template: ssh,vim,language-pack-en
Downloading ubuntu trusty minimal ...
I: Retrieving Release 
I: Retrieving Release.gpg 
I: Checking Release signature
  : (略)

Ubuntuテンプレートを使うと、以上のようにdebootstrapを使ってコンテナのイメージ作成が始まります。ダウンロードしたパッケージとパッケージを展開したファイルはキャッシュされます。次回同じバージョンのコンテナを作る場合、更新されているパッケージ以外はダウンロードしませんので、作成にかかる時間は速くなります。

Ubuntu以外のほとんどテンプレートでもキャッシュを使います。しかしキャッシュを使うかどうか、どのようにキャッシュを使うかはテンプレート次第です。

テンプレートオプション

lxc-ubuntuなどのディストリビューションのテンプレートを使う場合、テンプレートのオプションは特に指定しなくてもコンテナは作成できます。

しかしダウンロードテンプレートを使う場合は、どのイメージをインストールするのかを指定する必要があります。このようにテンプレートの動作を指定する時使うのがテンプレートオプションです。

ダウンロードテンプレート以外のテンプレートでも、各テンプレートの持つオプションを使って細かく設定できます。

テンプレートオプションを指定するには、lxc-create自身の持つオプションを指定した後に--を指定し、その後にテンプレートが持つオプションを指定します。

テンプレートが持つオプションを調べるには、以下のように-tオプションでテンプレートを指定して-hオプションを指定します。

$ lxc-create -t download -h
  :(略:lxc-create自身のヘルプが表示されます)
LXC container image downloader

Required arguments:
[ -d | --dist <distribution> ]: The name of the distribution
[ -r | --release <release> ]: Release name/version
[ -a | --arch <architecture> ]: Architecture of the container

Optional arguments:
[ -h | --help ]: This help message
[ -l | --list ]: List all available images
[ --variant <variant> ]: Variant of the image (default: "default")
[ --server <server> ]: Image server (default: "images.linuxcontainers.org")
[ --keyid <keyid> ]: GPG keyid (default: 0x...)
[ --keyserver <keyserver> ]: GPG keyserver to use
[ --no-validate ]: Disable GPG validation (not recommended)
[ --flush-cache ]: Flush the local copy (if present)
[ --force-cache ]; Force the use of the local copy even if expired

LXC internal arguments (do not pass manually!):
[ --name <name> ]: The container name
[ --path <path> ]: The path to the container
[ --rootfs <rootfs> ]: The path to the container's rootfs
[ --mapped-uid <map> ]: A uid map (user namespaces)
[ --mapped-gid <map> ]: A gid map (user namespaces)

ダウンロードテンプレートを使ったコンテナの作成

ダウンロードテンプレートを使い、以上で調べたオプションを指定してコンテナを作成してみましょう。テンプレートオプションとして最低限設定する必要があるのはディストリビューション、リリース、アーキテクチャです。

amd64アーキテクチャのUbuntu trustyコンテナイメージをダウンロードして作成するには以下のように実行します。

$ sudo lxc-create -t download -n ct01 -- -d ubuntu -r trusty -a amd64

このように実行すると、LXCのダウンロード用サーバからイメージをダウンロードしてコンテナを作成します。

ただしダウンロードテンプレートは、テンプレートオプションを指定しなくても、不足しているオプションは問い合わせてくれるように作られています。

$ sudo lxc-create -t download -n ct01
Setting up the GPG keyring
Downloading the image index

---
DIST    RELEASE ARCH    VARIANT BUILD
---
centos  6   amd64   default 20140810_02:16
centos  6   i386    default 20140810_02:16
centos  7   amd64   default 20140810_02:16
debian  jessie  amd64   default 20140809_22:42
debian  jessie  armel   default 20140809_22:42
debian  jessie  armhf   default 20140809_22:42
debian  jessie  i386    default 20140809_22:42
debian  sid amd64   default 20140809_22:42
debian  sid armel   default 20140809_22:42
debian  sid armhf   default 20140809_22:42
debian  sid i386    default 20140809_22:42
  :(略)
Distribution: ubuntu (←入力)
Release: utopic (←入力)
Architecture: amd64 (←入力)

Downloading the image index
Downloading the rootfs
  :(略)

ダウンロードテンプレートでも、ダウンロードしたコンテナイメージはキャッシュされます。次回、同じコンテナイメージを使ってコンテナを作成する場合は、コンテナイメージの更新がなければキャッシュされたイメージを使用します。

作られたコンテナの確認

lxc-createコマンドの実行で作られたコンテナのファイルや設定ファイルを少し見ておきましょう。先のダウンロードテンプレートで作ったct01コンテナを例にあげます。

コンテナの設定ファイルとイメージはコンテナの保存場所ディレクトリ直下にコンテナ用ディレクトリを作成して、そこに保存されます。

Ubuntuの場合、保存場所は/var/lib/lxcですから、ct01コンテナのファイルは/var/lib/lxc/ct01以下に保存されます。

$ ls -lF /var/lib/lxc/ct01/
total 4
-rw-r--r-- 1 root root 549 Aug 11 17:05 config
drwxr-xr-x 1 root root 132 Aug 13 15:07 rootfs/

ここにあるrootfsディレクトリがコンテナの/(ルート)となります。

$ ls -F /var/lib/lxc/ct01/rootfs/
bin/   dev/  home/  lib64/  mnt/  proc/  run/   srv/  tmp/  var/
boot/  etc/  lib/   media/  opt/  root/  sbin/  sys/  usr/

/var/lib/lxc/ct01/configct01の設定ファイルです。内容は以下のようになっています。最後の4行は、先に紹介したコンテナのデフォルト設定ファイルdefault.confの内容がコピーされています[1]⁠。

$ grep -v "^#" /var/lib/lxc/ct01/config | grep -v "^\s*$"
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.rootfs = /var/lib/lxc/ct01/rootfs
lxc.mount = /var/lib/lxc/ct01/fstab
lxc.utsname = ct01
lxc.arch = amd64
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:26:29:5a

設定ファイルについてはこの連載の後の回で紹介します。

ホストOSのディストリビューションと指定するテンプレートの関係

ここではUbuntu上でUbuntuテンプレートとダウンロードテンプレートを使ってコンテナを作りました。

ダウンロードテンプレートは多くの環境にインストールされている基本的なコマンドを使ってコンテナイメージを展開しますので、ホストOSがどのような環境であっても問題なく使えることが多いでしょう。

また、ホストOSのディストリビューションと同じディストリビューションのコンテナを作成するテンプレートを使った場合も、コンテナ作成に必要なコマンドが含まれたパッケージがインストールされていれば問題なく作成できます。必要なコマンドがインストールされていない場合でも、パッケージを追加でインストールすれば済みます。

では、ホストOSのディストリビューションと異なるディストリビューションのコンテナを作成するテンプレートを使う場合はどうでしょう。

ホストOSのディストリビューションにかかわらず、lxc-createを実行するときは任意のテンプレートを指定できます。しかし、テンプレート内で使っているコンテナ作成に必要なコマンドが、ホストOS上にインストールされていない場合はコンテナは作成できません。

たとえばyumやrpmコマンドがないのにyumを使ってパッケージをインストールするlxc-centosを使ってCentOSコンテナは作成できません。

ホストOSのディストリビューションと異なるディストリビューションのテンプレートを使う場合は、コンテナの作成に必要なコマンドを含むパッケージ自体がホストOSのディストリビューションに用意されていないこともあるため、コンテナが作成できないケースも多いでしょう。

コンテナの情報表示 ~ lxc-ls, lxc-info

コンテナを作成したところで、コンテナの情報を表示させてみましょう。現在、ホスト上に存在するコンテナの一覧を表示するにはlxc-lsを使います。

$ sudo lxc-ls
ct01      plamo01   ubuntu01

以上のようにコンテナの一覧を表示するだけでなく、コンテナの稼動状態を簡易的に表示できます。

$ sudo lxc-ls --fancy
NAME      STATE    IPV4       IPV6  AUTOSTART
---------------------------------------------
ct01      RUNNING  10.0.3.92  -     NO
plamo01   STOPPED  -          -     NO
ubuntu01  STOPPED  -          -     NO

以上のようにデフォルトではコンテナ名、状態、IPv4アドレス、IPv6アドレス、ホスト起動時の自動起動が設定されているかどうかを表示します。

--fancyオプションで表示させる項目は--fancy-formatオプションにカンマ区切りで表示させたい項目を指定して変更できます。

$ sudo lxc-ls --fancy --fancy-format=name,state,ipv4,ipv6,autostart,pid,memory,ram,swap
NAME      STATE    IPV4       IPV6  AUTOSTART  PID    MEMORY   RAM      SWAP
-----------------------------------------------------------------------------
ct01      RUNNING  10.0.3.92  -     NO         26948  27.98MB  27.98MB  0.0MB
plamo01   STOPPED  -          -     NO         -      -        -        -
ubuntu01  STOPPED  -          -     NO         -      -        -        -

この例では、指定可能な項目名を全て指定してみました。

なお、lxc-ls前回説明した通り、Python3バインディングを使って実装されていますので、Python3がない環境では動かないか、0.8.0まで存在していたシェルスクリプトのlxc-lsがインストールされているかもしれません。

その場合は以上のような詳細な情報の表示はできませんので、以下で説明する単独のコンテナの情報を表示させるlxc-infoというコマンドを使います。こちらはC言語で実装されています。

$ sudo lxc-info -n ct01 
Name:           ct01
State:          RUNNING
PID:            26948
IP:             10.0.3.92
CPU use:        3.22 seconds
BlkIO use:      36.22 MiB
Memory use:     27.98 MiB
KMem use:       0 bytes
Link:           vethJD5M03
 TX bytes:      3.49 KiB
 RX bytes:      3.32 KiB
 Total bytes:   6.81 KiB

lxc-lsより少し表示できる情報が多く、コンテナの設定も表示できます。

$ sudo lxc-info -n ct01 -c lxc.utsname -c lxc.rootfs
lxc.utsname = ct01
lxc.rootfs = /var/lib/lxc/ct01/rootfs

設定を表示させる機能については、LXCの設定ファイルはテキストですから直接見ればよいので、あまり使うことはないかもしれませんね。

なお、lxc.network.*の設定値を表示させる場合は少し使い方に注意が必要です。

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:54:1f:bd

という設定がある場合、設定ファイルのキーをそのまま指定すると、

$ sudo lxc-info -n ct01 -c lxc.network.flags
lxc.network.flags invalid

となってしまいます。これはコンテナ用に複数のネットワークインターフェースを定義できるためです。上の例でちゃんと値を表示させるためには、

$ sudo lxc-info -n ct01 -c lxc.network.0.flags
lxc.network.0.flags = up

という風に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で確認してください。

それでは起動してみましょう。

$ sudo lxc-start -n ct01
<4>init: plymouth-upstart-bridge main process (5) terminated with status 1
<4>init: plymouth-upstart-bridge main process ended, respawning
<4>init: hwclock main process (7) terminated with status 77
<4>init: plymouth-upstart-bridge main process (15) terminated with status 1
<4>init: plymouth-upstart-bridge main process ended, respawning
<4>init: ureadahead main process (8) terminated with status 5
  : (略)

以上のようにフォアグラウンドで起動すると、通常のOS起動時のような出力が表示された後にログインプロンプトが表示されます。

コンテナの起動に問題がある時はLXCのエラーが出力されることがあります。しかし、問題解決に十分な情報がでない場合が多いので詳しくエラーの中身を見たい場合は共通オプションにあったログ出力を指定しましょう。

$ sudo lxc-start -n ct01 -o logfile -l DEBUG

このように起動するとlogfileというファイルにDEBUGレベル以上のログが出力されます。

コンテナが起動することが確認できればバックグラウンドで起動すれば良いでしょうから、-dオプションを付けて起動します。

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

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

おすすめ記事

記事・ニュース一覧