今回からはLXCの基本的なコマンドを使ったコンテナの操作を、
ここではUbuntu 14.
Ubuntuパッケージ使用時の各種パス
最初にUbuntuのLXCパッケージを使用した場合の各種ファイルやディレクトリのパスを紹介しておきます。他のディストリビューションでは異なる可能性がありますし、
ファイル/ | パス |
---|---|
システム設定ファイル | /etc/ |
コンテナのデフォルト設定ファイル | /etc/ |
テンプレートファイルの置き場所 | /usr/ |
コンテナ起動時に読み込まれるファイルの置き場所 | /usr/ |
コンテナ作成時のキャッシュの置き場所 | /var/ |
コンテナの保存場所 | /var/ |
ログファイルの出力場所 | /var/ |
表に出てくるファイルやディレクトリでこれまで説明がなかったものについて説明します。
- システム設定ファイル
- この後説明するコンテナの保存場所のパス、
コンテナの設定ファイルの場所、 ストレージバックエンド使用時のデフォルト値などの、 システム共通で使用するデフォルト値を指定したい場合にファイルを作成して値を設定します。ファイルが存在しない場合はコンパイル時の値が使用されます。 - コンテナのデフォルト設定ファイル
- コンテナを作成する時に共通して設定したいものを記載しておきます。コンテナ作成時にこのファイルの設定値がコンテナの設定ファイルにコピーされます。
- コンテナ起動時に読み込まれるファイル
- テンプレートを使ったコンテナの作成で生成されるコンテナの設定ファイルは、
各ディストリビューションのデフォルト設定を読み込む (includeする) 設定が書き込まれます。そのディストリビューションごとのデフォルト設定が書かれたファイルが /usr/
に置かれています。コンテナの起動時に、share/ lxc/ config includeされたこのファイルに書かれた設定を読み込みます。 - コンテナ作成時のキャッシュ
- テンプレートはキャッシュを使ってコンテナの作成時間を短縮することがあります。キャッシュについてはコンテナ作成のところで説明します。
- コンテナの保存場所
- コンテナイメージとコンテナごとの設定ファイル、
つまりコンテナそのものを置く場所です。コンテナの作成時や起動時に特に指定しなければ、 このディレクトリ ( /var/
)lib/ lxc を使用します。このディレクトリ以下をどのように使うかは後ほど、 作成したコンテナの確認を行うところで説明します。 - ログファイル
- コンテナごとにログファイルが出力されます。特に出力するログファイルを指定しなければ
/var/
以下にlog/ lxc
というファイルが作成されます。(コンテナ名) .log
Ubuntu上でLXCパッケージ使った時のコンテナ用のネットワーク
LXCで提供されているコマンドを使った説明に入る前に、
![図1 Ubuntu LXCパッケージのコンテナネットワーク 図1 Ubuntu LXCパッケージのコンテナネットワーク](/assets/images/admin/serial/01/linux_containers/0008/thumb/TH800_001.jpg)
ホストOSの起動時にコンテナを接続するためのブリッジとしてlxcbr0
が作成されます。コンテナ用のネットワークとしてはデフォルトで10.
コンテナにDHCPでIPアドレスを割り当て、
また、
ブリッジの名前やコンテナ用のネットワークのアドレスは、/etc/
に設定されていますのでこのファイルを編集して変更できます。
$ 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/
)
$ 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-
で始まるコンテナに対する操作や管理を行うコマンド群が提供されています。最初にこのコマンド群のほとんどで共通して使えるオプションを紹介しておきましょう。
オプション | オプションの意味 |
---|---|
-h / --help | ヘルプの表示 |
--usage | コマンドの使いかたの表示 |
-q / --quiet | 画面出力の抑止 |
-P / --lxcpath | コンテナの保存場所 |
-o / --logfile | コンテナのログファイルのパス |
-l / --logpriority | ログのプライオリティ |
-n / --name | コンテナの名前 |
ここで紹介したオプションはほとんどのLXCコマンドで使用できますが、
-n
/--name
オプションはほとんどのコマンドで必要なコンテナ名を指定するオプションです。ほとんどのコマンドで必要にもかかわらず、
-P
/--lxcpath
はデフォルトと違うパスにコンテナを設置する場合に使いますが、
コンテナの作成 ~ lxc-create
まずはコンテナの作成です。コンテナの作成には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
このように実行すると、
ただしダウンロードテンプレートは、
$ 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/
ですから、ct01
コンテナのファイルは/var/
以下に保存されます。
$ 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/
はct01
の設定ファイルです。内容は以下のようになっています。最後の4行は、default.
の内容がコピーされています
$ 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のディストリビューションにかかわらず、lxc-create
を実行するときは任意のテンプレートを指定できます。しかし、
たとえばyumやrpmコマンドがないのにyumを使ってパッケージをインストールするlxc-centos
を使ってCentOSコンテナは作成できません。
ホスト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
以上のようにデフォルトではコンテナ名、
--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
は前回説明した通り、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.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.
コンテナの情報表示を行うコマンドを2つ紹介しました。筆者は、lxc-ls
をよく使います。
コンテナの起動 ~ lxc-start
コンテナの存在や状態の確認ができるようになったところでいよいよコンテナを起動してみましょう。
連載のこれまでの回で少し紹介したように、lxc-start
コマンドを使用します。起動の前に主なオプションを確認しておきましょう。
オプション | 意味 |
---|---|
-d / --daemon | デーモンモードで起動 |
-f / --rcfile | 設定ファイルの指定 |
-s / --define | 設定の指定 |
-d
を付けないと、lxc-start
はフォアグラウンドで起動しますので、-d
を付けなければいけないので少し不便ですね。
次のバージョン-d
のデーモンモードがデフォルトになる予定です。現在のバージョンである1.-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 : (略)
以上のようにフォアグラウンドで起動すると、
コンテナの起動に問題がある時は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
システムコンテナの停止やリブートを行いたい場合は、
加えて、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-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
です。
コンテナのinit
でSIGINT
を受け取った時の設定がされていなければリブートしないのも停止の場合と同様です。一般的にはinit
ではCtrl+Alt+Delキーを押した時の動作として設定されていますね。
コンテナのリブートも、
コンテナ内での作業
これでコンテナの起動、
ssh
すぐに思い浮かぶのはコンテナにssh経由で接続することですね。ホストOSへのアクセス権がなく、
コンテナ内でsshdが起動するように設定されていて、
sshでアクセスする場合、
ここで少し考えてみてください。ホストOSにアクセスできて、
ログへのアクセスや設定ファイルの更新
ここまでで説明したとおり、
コンテナへのアクセスの目的がログを見たいとか、cd
コマンドでディレクトリを移動すれば、
ログを見たり、
たとえば、ct01
コンテナ内の/var/
の中が見たいのであれば、
$ 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
はコンソールですから、lxc-attach
を使う必要があります。
lxc-attach
lxc-attachはホストOSからコンテナ内で直接コマンドを実行するためのコマンドです。正確にいうと、
第2回で説明したとおり、
ホスト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
以上のようにコンテナに設定されているホスト名、
ここでシェルを実行すると、
$ sudo lxc-attach -n ct01 -- /bin/bash root@ct01:/#
lxc-attach
自身のオプションとlxc-attach
を使って実行するコマンドをきちっと分離するために、lxc-attach
のオプションを指定した後に--
を与えて、
lxc-attach
にはたくさんのオプションがありますが、man lxc-attach
を実行して確認してください。
lxc-attach
を使えば、
名前空間を使って隔離された空間を作成しているだけ、
lxc-attach
は便利なコマンドですが、lxc-attach
はバージョン3.lxc-console
を使う必要があります。
まとめ
今回はコンテナの基本的な操作を中心に説明しました。これでコンテナを作成して、
コンテナ内での作業は、
次回もLXCが持っているいろいろな便利なコマンドについて説明したいと思います。その後の回で設定ファイルの説明を行う予定です。