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

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

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

コンテナの作成 ~ 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

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

※1)
lxc.network.hwaddrはそのままコピーされているわけではありません。これについてはコンテナの設定について紹介する際に説明します。

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

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

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

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

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

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

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

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

著者プロフィール

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

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

Plamo Linuxメンテナ

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