動作環境

必須の環境:

lxc-attach の動作に必要な環境:

非特権のコンテナが動作するのに必要な環境:

推奨ライブラリ:

インストール

通常はあなたがお使いのディストリビューションが、ディストリビューションのパッケージリポジトリもしくはバックポート用のチャンネル経由で、最新版の LXC を提供しているでしょう。

最初に LXC を使う場合は、LXC 1.0 の最新のバグフィックスのなされたバージョンのような、最新のサポート版リリースをお使いになることを推奨します。

Ubuntu を使っている場合、コンテナホストとして Ubuntu 14.04 LTS を使うことを推奨します。 LXC のバグフィックスリリースは、リリース後すぐに直接ディストリビューションのパッケージリポジトリ経由で利用可能で、パッチの当たっていないクリーンな最新版を提供します。

Ubuntu は、安全な非特権の LXC コンテナのために必要な全てをデフォルトで揃えている Linux ディストリビューションのいくつかのうちの 1 つです (Ubuntu 以外にもそのようなディストリビューションは存在します)。

Ubuntu では、LXC をインストールするのは以下のように簡単です:

sudo apt-get install lxc

あなたのシステム上には、利用可能な LXC コマンドの全て、テンプレートの全て、LXC 処理のスクリプトに必要な python3 バインディングがインストールされるでしょう。

非特権コンテナの作成

非特権コンテナは最も安全なコンテナです。 非特権コンテナでは、コンテナで使う範囲の uid と gid を割り当てるために、uid と gid のマッピングを使います。 これはコンテナ内の uid 0 (root) が、コンテナの外では実際は uid が 100000 を持つというようになります。 それゆえ、万が一間違って問題のある操作を行ったり、攻撃者がコンテナを抜けだそうとしても、nobody ユーザと同じ程度の権限しか自身にないことがわかるでしょう。

残念ながら、このことは同時に以下のような操作が非特権コンテナでは許可されないことを意味します:

このため、ほとんどのディストリビューションのコンテナテンプレートは動作しないでしょう。 代わりに、このような非特権の環境でも動くことを確認した、あらかじめビルド済みのディストリビューションのイメージを提供する "download" テンプレートを使う必要があります。

現在、最新の Ubuntu か最新の Ubuntu と同じような環境 (最新のカーネル、最新バージョンの shadow、cgmanager、デフォルトの uid/gid 割り当て) の他の Linux ディストリビューションで、同様に以下のような操作ができるはずです。

まず第一に、お使いの (非特権コンテナを使おうとする) ユーザが /etc/subuid と /etc/subgid で定義された uid/gid のマッピングを持っている必要があります。 Ubuntu では、デフォルトで 65536 個の uid と gid の割り当てが、システム上で全ての新規ユーザに与えられますので、Ubuntu をお使いの場合はすでにそのマッピングを持っているはずです。 もしマッピングがない場合は、usermod コマンドを使って割り当てる必要があります。

次に、非特権ユーザに与えるネットワークデバイスの範囲を設定するために使う /etc/lxc/lxc-usernet を設定します。 デフォルトでは、ホスト上で全くネットワークデバイスを割り当てできないことになっていますので、このファイルに以下のような設定を追加します:

your-username veth lxcbr0 10

これは、"your-username" にブリッジ lxcbr0 に接続する 10 個の veth デバイスの作成を許可するという意味です。

これが済むと、最後のステップは LXC の設定ファイルの作成です。

ここで設定した値は /etc/subuid と /etc/subgid にある値と一致している必要があり、標準の Ubuntu システムの初期ユーザのために存在が必要です。

最初のコンテナを作成するまえに、おそらく一度ログアウトしてログインするか、マシンのリブートが必要になるでしょう。これはお使いのユーザが使う cgroup が正しく作成されていることを確実にするためです。 (これは LXC をインストールする前にあなたのマシンに cgmanager がインストールされていなかった場合のみ必要なことです。)

さて、以下のようにコンテナを作ってみましょう:

lxc-create -t download -n my-container

ダウンロードテンプレートが選択できるディストリビューション、バージョン、アーキテクチャのリストを表示します。 例として一番良いのは "ubuntu"、"trusty" (14.04 LTS)、"i386" でしょう。

しばらくすると、コンテナが作成されますので、以下のように実行します:

lxc-start -n my-container -d

実行したコンテナのステータスは以下のどちらかで確認できます:

lxc-info -n my-container
lxc-ls -f

コンテナ内でシェルを実行するには以下のようにします:

lxc-attach -n my-container

コンテナの停止は以下のように行います:

lxc-stop -n my-container

最後にコンテナを消去するには以下のようにします:

lxc-destroy -n my-container

root で非特権コンテナを作成する

システム全体で非特権コンテナを実行するには (これは root が非特権コンテナを実行するということです)、以下のような前述のステップの一部が必要なだけです。

具体的に言うと、root に対して割り当てる uid と gid の範囲を /etc/subuid と /etc/subgid に割り当てる必要があります。 そして、その範囲を先と同様に /etc/lxc/default.conf に lxc.id_map を使って設定します。

以上です。root はネットワークデバイスの範囲を設定する必要はありません。グローバルの設定ファイルの設定を使いますので、このステップは不要です。

このようにして作成したコンテナは非特権コンテナとして動作するでしょう。

特権コンテナ

特権コンテナは root が作成し、root が実行します。

ディストリビューションによっては、特権コンテナはケーパビリティをいくつか落としたり、apparmor プロファイルや、SELinux コンテキスト、seccomp ポリシーでプロテクトされているかもしれません。しかし、最終的にはプロセスは root 権限で実行されますので、信頼できないユーザに特権コンテナ内の root 権限を与えるべきではありません。

特権コンテナを作成する必要がある場合は、非常に簡単です。単純に前述のようなステップを踏むことなく、特権コンテナが作成されます。

sudo lxc-create -t download -n privileged-container

以上のコマンドで、ダウンロードテンプレートからのイメージを使って、システム上に新しい "privileged-container" という名前の特権コンテナが作成されるでしょう。