Linux コンテナ (LXC) は軽量の仮想化テクノロジであり、さまざまな用途があります。これは Linux カーネルの一部であり、単一の Linux ホスト上で 1 つまたは複数の Linux ディストリビューションをエミュレートできます。これは、chroot と VirtualBox、KVM、Xen などの完全仮想化テクノロジの間の中間点と考えてください。 BSD の世界に存在する同様のテクノロジーに FreeBSD Jail があります。
例として、私が執筆しているマシンは、Intel Atom プロセッサを搭載した Linux Mint 18 を実行するラップトップで、RAM はわずか 2 GB です。それでも、私は 3 つの Linux コンテナを実行しており、それぞれに Apache Web サーバーのインスタンスが実行されていますが、パフォーマンスに大きな影響はありません。これは、VirtualBox のような従来の仮想マシンでは考えられません。したがって、Linux システム上で複数のディストリビューションを実行したい場合は、Linux コンテナーがその仕事をうまくやってくれるはずです。
Linux コンテナのインストールと構成
Linux Mint 18 64ビット上にLXCをセットアップしています。ここで説明するインストール手順は、変更せずに Ubuntu 16.04 以降でも機能します。別のディストリビューションを使用している場合、何かが期待どおりに動作しない場合は、そのディストリビューションの公式ドキュメントを参照してください。コマンド ラインと一般的なトラブルシューティングに精通していることも前提となります。
前提条件
複数のディストリビューションを使用し始めるために設定する必要があることがいくつかあります。
1. 以下を使用して、 LXC およびその他の前提条件ソフトウェアをインストールします。
[ソースコード]sudo apt install lxc lxc-templates uidmap[/sourcecode]
2. 次に、プロファイルを構成する必要があります。次のコマンドを入力して設定します。
[ソースコード]mkdir -p ~/.config/lxc
echo “lxc.id_map = u 0 100000 65536” > ~/.config/lxc/default.conf
echo “lxc.id_map = g 0 100000 65536” >> ~/.config/lxc/default.conf
echo “lxc.network.type = veth” >> ~/.config/lxc/default.conf
echo “lxc.network.link = lxcbr0” >> ~/.config/lxc/default.conf
echo “$USER veth lxcbr0 2” | sudo tee -a /etc/lxc/lxc-usernet[/sourcecode]
3. 次に、次のようにユーザー権限を設定する必要があります。
[ソースコード] sudo usermod –add-subuids 100000-165536 $USER
sudo usermod –add-subgids 100000-165536 $USER
sudo cgm すべてのユーザーを作成
sudo cgm chown すべてのユーザー $(id -u) $(id -g)
cgm movepid すべてのユーザー $$[/sourcecode]
コンテナのセットアップ
LXC コンテナーが他の前提条件ソフトウェアとともにインストールされたので、コンテナーをセットアップする手順は次のとおりです。
1. この例では、<code>ubu1</code> という名前のUbuntu コンテナをセットアップします。これを行うには、次のコマンドを実行します。
[ソースコード]lxc-create –テンプレートのダウンロード –name ubu1[/sourcecode]
2. ここで、<code>–template</code> パラメータは lxc にインターネットから事前設定されたイメージをダウンロードするように指示し、<code>–name</code> パラメータはコンテナの名前 (<code>ubu1<) を指定します。この場合は /code> です。好きな名前を使用できます。
3.サポートされているディストリビューション イメージのリストが表示されます。

4. インストールするディストリビューションの詳細を入力します。ここに 64 ビット版の Ubuntu 16.04 (コード名 xenial) をインストールします。

5.イメージを非対話的にインストールする場合は、次のコマンドを実行すると上記と同じ結果が得られます。
[ソースコード]lxc-create -t download -n ubu1 — –dist ubuntu –release xenial –arch amd64[/sourcecode]
6. LXC は、ホスト システムに最小限の Ubuntu xenial イメージをダウンロードしてインストールします。インターネット接続と PC の速度によっては、ダウンロードとインストールに少し時間がかかる場合があります。インストール後、次のような画面が表示されます。

これで、新しくセットアップした Ubuntu コンテナを使用する準備が整いました。
Linux コンテナでの複数のディストリビューションの使用
コンテナの起動
<code>lxc-start</code> コマンドを使用してコンテナを起動します。
[ソースコード]lxc-start -n ubu1 -d[/ソースコード]
ここで、<code>-n</code> パラメータは起動するコンテナの名前 (この場合は <code>ubu1</code>) を指定し、<code>-d</code> パラメータはバックグラウンドで実行させます。
<code>lxc-ls</code> コマンドを使用して、コンテナが起動したことを確認できます。
[ソースコード]lxc-ls -f[/ソースコード]

<code>-f</code> パラメータを使用すると、高度なレポートが有効になります。ここでは、 2 つのコンテナー(Debian (停止) と Ubuntu (実行中) の 1 つ) があることがわかります。
コンテナへのアクセスと使用
<code>lxc-attach</code> コマンドを使用してコンテナのコンソールにアクセスできます。
[ソースコード]lxc-attach -n ubu1[/ソースコード]
これでコンテナ上にroot シェルができました。 root ユーザーのパスワードを設定し、通常のユーザー アカウントを作成することをお勧めします。
[ソースコード]パスワード
adduser [/sourcecode]
もちろん、 を必要なユーザー名に置き換えます。その後、通常のシステムで行うのと同様に、ソフトウェアをインストールしてコンテナーを構成できます。たとえば、Debian または Ubuntu コンテナでは次のようになります。
[ソースコード]apt install wget openssh-server htop tmux nano iptables[/sourcecode]
コンテナの停止
コンテナーでの操作が終了したら、<code>exit</code> コマンドを使用してホスト システムに戻ります。次に、 <code>lxc-stop</code> コマンドを使用してコンテナを停止します。
[ソースコード]lxc-stop -n ubu1[/ソースコード]
これにより、コンテナーが正常にシャットダウンされ、ディスク領域を除いてシステム上のリソースが消費されなくなります。
クローン作成とスナップショット
クローン
コンテナにプログラムをインストールし、好みに合わせて構成したら、プロビジョニングを容易にするために、そのコピーを 1 つまたは複数作成することができます。これを行うには、コンテナーの正確なレプリカであるクローンを作成します。
たとえば、<code>ubu1</code> コンテナのクローン (<code>ubu2</code> と呼びます) を作成するには、まず <code>lxc-stop</code> を使用してコンテナを停止し、次に次を使用します。 <code>lxc-copy</code> コマンド:
[ソースコード]lxc-stop -n ubu1
lxc-copy -n ubu1 -N ubu2[/sourcecode]
ここで、 -n オプションはソース コンテナを指定し、 -N オプションはクローンの名前を指定します。コンテナーが複製されたことを確認するには、<code>lxc-ls</code> コマンドを使用します。

スナップショット
Web サーバーの再構成など、コンテナに対して潜在的に危険な変更や回復が困難な変更を行おうとしているとします。損傷を最小限に抑えるために、変更を加える前にコンテナのスナップショットを作成できます。構成中に問題が発生した場合は、コンテナを停止し、スナップショットを復元することで以前の動作状態に復元できます。
スナップショットを作成するには、まずコンテナを停止します。
[ソースコード]lxc-stop -n ubu1[/ソースコード]
次に、<code>lxc-snapshot</code> コマンドを使用してスナップショットを作成します。
[ソースコード]lxc-snapshot -n ubu1[/ソースコード]
これにより、<code>snap0</code> という名前のスナップショットが作成されます。このコマンドを使用して作成する後続のスナップショットは、 snap1 、 snap2などと呼ばれます。
この後、コンテナを起動し、必要な変更を加えることができます。作成したスナップショットに戻りたい場合はいつでも、コンテナを停止し、 <code>-r</code> パラメータを指定して <code>lxc-snapshot</code> コマンドを使用してスナップショットを復元します。
[ソースコード]lxc-snapshot -r snap0 -n ubu1[/ソースコード]
これにより、スナップショット <code>snap0</code> が <code>ubu1</code> コンテナに復元されます。
起動時にコンテナを自動起動する
システムの起動時に、Web サーバー コンテナなどのコンテナが自動的に起動するようにすることができます。これを行うには、<code>$HOME/.local/share/lxc/<NAME OF CONTAINER>/config</code> にあるコンテナの構成ファイルに移動し、次の行を追加します。
[ソースコード]lxc.start.auto = 1
lxc.start.delay = 5[/ソースコード]
最初の行は、ブート時にコンテナーを開始する必要があることを指定します。 2 つ目は、次のコンテナーがあればそれを開始する前に5 秒待つようにシステムに指示します。
トラブルシューティング
コンテナの起動に問題がある場合は、まず <code>lxc-start</code> コマンドをフォアグラウンドモードで実行してみてください。例えば:
[ソースコード]lxc-start -n ubu1 -F[/ソースコード]
これにより、現在のコンソール上のエラーが表示され、問題の性質を特定するのに非常に役立ちます。
複数のコンテナを同時に実行する場合の問題
複数のコンテナを一度に実行しようとすると、「クォータに達しました」または「構成されたネットワークの作成に失敗しました」などのエラーが表示される場合があります。これは、割り当てられている以上のネットワーク インターフェイスを実行しているためです。 rootとして <code>/etc/lxc/lxc-usernet</code> ファイルを変更することで、ユーザーが実行できるネットワーク ブリッジの数を増やすことができます。次のようになります。
[ソースコード]# ユーザー名タイプ ブリッジ数
ビーボム ヴェス lxcbr0 5[/sourcecode]
最後の数字 (この例では 5) を 10 などの大きな数字に変更できます。これにより、一度に最大 10 個のコンテナーを実行できるようになります。
Linux コンテナのその他の用途
Linux コンテナにはさまざまな用途があります。たとえば、実稼働サーバーにコミットする前に、Web サーバーやデータベース サーバーのさまざまな構成をテストするための軽量のテスト ボックスとして使用できます。別の使用例は、さまざまなディストリビューションのさまざまなバージョンでアプリケーションがどのように実行されるかをテストすることです。
また、これらを使用して、信頼できないアプリケーションを隔離することもできます。そのようなアプリケーションによる損害は、そのアプリケーション自体のコンテナに限定され、ホスト システムには影響しません。コンテナ内で GUI アプリケーションを実行することは可能ですが、かなりの時間と労力がかかるため、お勧めできません。サンドボックスで GUI アプリを実行したい場合は、Linux でアプリをサンドボックスする方法に関する記事を参照してください。
関連項目: 使用できる VirtualBox の代替手段 7 選
Linux コンテナで複数のディストリビューションを同時に実行する
これで、フルサイズの仮想マシンのオーバーヘッドを発生させずに、1 台のコンピューター上で複数の Linux ディストリビューションを実行するためのハウツーは終了です。このテクノロジーの有用性はあなたの創造性によってのみ制限されるため、自由に実験して新しい使用例を見つけてください。コンテナのセットアップに問題がある場合は、コメント欄でお気軽にご質問ください。






![2021 年に Raspberry Pi Web サーバーをセットアップする方法 [ガイド]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)



