序章

LXC(Linux Containers)は、最新のLinuxカーネルに含まれる多くの機能に基づいて構築されたシステムであり、単一の親ホストシステム上で多くの仮想化Linuxシステムを作成および管理できます。 ただし、一部の仮想化ソリューションとは異なり、ハードウェアエミュレーションは使用されず、コンテナーはカーネルをホストと共有します。これにより、LXCは非常に軽量で、使い始めるのが簡単になります。 また、メインラインのカーネル機能のみに依存しているため、LXCはDigitalOceanのKVMイメージ内で使用できます。

LXCの主な利点は次のとおりです。

セキュリティ-個別のコンテナ内で主要なサービスを実行することにより、1つのセキュリティ上の欠陥を他のサービスへの影響からより適切に分離したままにすることができます。 これはchrootjailと非常によく似ているように聞こえるかもしれませんが、LXCは単なるファイルシステムの分離以上のものを提供します。

移植性-LXCコンテナーを圧縮して、同じプロセッサーアーキテクチャーを持つ他のホストに移動できます。 これは、個々のサービスを簡単に複製または移動できるため、アプリケーションをスケーリングするときに最適に機能します。

制限-Linuxcgroupを使用しているため、LXCコンテナーはリソースの制限付きで構成できます。 多数のコンテナーを実行する場合、これにより、最も重要なコンテナーが最優先されるようになります。

注:次のチュートリアルでは、ホスト上のすべてのコマンドがrootユーザーとして実行されることを前提としています。

警告:Debianシステムで次のチュートリアルを使用しないでください。 それらの類似性にもかかわらず、Debian LXCパッケージには、コンテナとそのホストシステム間の適切な分離を妨げる多くの欠陥があります。

インストール

最初のLXCコンテナーを作成する前に、それらを管理および作成するために必要なツールをインストールする必要があります。

apt-get install lxc

このパッケージはLXCの要件をインストールし、コンテナーのネットワーク構造もセットアップします。 パッケージのインストールが完了すると、カーネルをチェックでき、lxc-checkconfigを実行して構成の準備が整います。

$ lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.8.0-19-generic
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: missing
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

‘ユーザー名前空間’が欠落していると示されていることに気付くかもしれません。 理想的には有効にする必要がありますが、このチュートリアルで提案されているユースケースでは、LXCは有効にされていなくても機能します。

新しいコンテナの作成

新しいLXCコンテナーは、lxc-createコマンドで作成されます。 ubuntu テンプレートを使用して、「test-container」という名前の新しいコンテナーを作成してデータを設定します。

lxc-create -n test-container -t ubuntu

このコマンドは、必要なすべてのコンポーネントをダウンロードしてキャッシュするため、最初の実行には数分かかる場合があります。 ただし、最終的には戻り、新しいコンテナにdebootstrapを使用して作成された最小限のUbuntuインストールがあります。

作成出力の最後の数行には、作成されたコンテナのデフォルトのユーザー名とパスワードも表示されます。

##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

いつでもlxc-ls–fancy を使用してコンテナーのステータスを確認できます。これにより、現在コンテナーが停止状態で表示されます。

# lxc-ls --fancy
NAME            STATE    IPV4  IPV6  AUTOSTART
----------------------------------------------
test-container  STOPPED  -     -     NO

設定ファイルが保存されたら、次のステップはコンテナを実行することです。これはlxc-startで実行できます。

lxc-start -n test-container -d

このコマンドはすぐに戻りますが、コンテナはバックグラウンドで起動します。 数秒後、 lxc-ls –fancy を再試行すると、コンテナーが実行され、IPアドレスが割り当てられていることがわかります。

# lxc-ls --fancy
NAME            STATE    IPV4        IPV6  AUTOSTART
----------------------------------------------------
test-container  RUNNING  10.0.3.143  -     NO

割り当てられたIPは内部ブリッジに属していることに注意してください。つまり、コンテナは外部のDigitalOcean IPからアクセスできませんが、インターネットにはアクセスできます。 次のセクションでは、コンテナ内のサービスがパブリックVPSインターフェイスでリッスンできるようにするためのポートフォワーディングについて説明します。

最後に、lxc-consoleを使用してコンテナーにアクセスできます。

lxc-console -n test-container

これにより、コンテナに対して実行される通常のログインプロンプトが表示され、VPSの作成中に指定されたユーザー名/パスワードの組み合わせ(ubuntu / ubuntu)を使用できます。 ただし、インターネット向けサービスをホストするコンテナの場合は、このデフォルトのパスワードを変更することをお勧めします。

ログインすると、通常のbashプロンプトが表示され、ホストマシンで行うほとんどすべてのことを実行できます。 これは最小限のインストールであるため、使用するツールの一部が存在しないことに気付くかもしれませんが、これらは必要に応じてapt-getを介してインストールできます。

新しいコンテナの探索が終了したら、Ctrl-Aに続けてQと入力して、コンソールを終了し、ホストに戻ることができます。

サービスのインストール

例として、nginxをコンテナにインストールし、インターネットからアクセスできるようにします。 私たちのコンテナは、独自のUbuntu VPSインスタンスを効果的に実行しています。つまり、サービスのインストールは、ホスト自体へのインストールとほとんど同じです。 したがって、ここDigitalOceanに関するチュートリアルの多くは、コンテナ内でもうまく機能するはずです。

lxc-console を介して接続すると、nginxパッケージをインストールできます。

sudo apt-get install nginx
sudo service nginx start

これによりnginxがインストールされ、実行されていることが確認されますが、ホストのパブリックインターフェイスからはまだアクセスできません。 http:// your-DO-ipに移動し、まだ応答していないことに注意すると、これが当てはまることがわかります。

前述のように、コンテナには、NATの背後で動作するプライベート範囲のIPが与えられているため、通常はインターネットからアクセスできません。 これは、ほとんどのホームネットワークの動作と似ており、すべてのコンピューターがゲートウェイ上で1つのIPを共有します。

ホストでiptablesを使用すると、NATがどのように構成されているかを確認できます。

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24

この設定により、すべてのコンテナが外部ネットワークにアクセスできるようになりますが、コンテナ上のサービスをインターネットに公開するには、ポート転送が必要です。

上からのlxc-ls–fancy 出力をもう一度見ると、コンテナーにプライベートIP 10.0.3.143が割り当てられていることがわかります(これはおそらく異なるでしょう)。 事前ルーティングテーブルにiptablesルールを追加することで、ポート80のパケットをnginxコンテナのポート80に転送できます。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.3.143:80

注:ポート80でリッスンしているホストにすでにサービスがある場合、このルールはすべてのパケットをコンテナーに転送するため(実行されていない場合でも)、ホストのサービスにアクセスできなくなります。

http:// your-DO-ip に移動すると、デフォルトのnginxページが表示され、セットアップとポート転送が成功したことがわかります。

このプロセスは、実行したい他のサービスの新しいコンテナで繰り返すことができます。 この方法の利点は、nginxでセキュリティ上の欠陥が発見されて悪用された場合、攻撃者は最初にコンテナをエスケープする別の悪用を見つけることなく、データベースなどの他のサービスに影響を与えることができないことです。

制限の追加

単なる分離に加えて、LXCを使用するもう1つの大きな利点は、コンテナー内のプロセスにcgroup制限を適用できることです。

コンテナーの制限は、その構成ファイルで定義されています。このコンテナーの場合、コンテナーは / var / lib / lxc / test-container /configにあります。

メモリ制限を使用して、コンテナの最大RAM使用量を設定できます。 この場合、コンテナを50MBのメモリに制限します。

lxc.cgroup.memory.limit_in_bytes = 50000000

CPU制限の定義は少し異なります。 物理的な制限が定義されているメモリとは異なり、CPUの制限はCPUの「共有」で動作します。

lxc.cgroup.cpu.shares = 100

これらの共有は物理量にリンクされていませんが、CPUリソースの相対的な割り当てを表しているだけです。つまり、共有が多いコンテナほどCPUアクセスの優先度が高くなります。 ただし、使用される数値は完全に任意であるため、1つのコンテナに10と別の20を指定することは、それぞれ1000と2000を指定することと同じです。これは、2番目のコンテナのCPU共有の優先度が2倍であることを示しています。 コンテナ間のスケールと一致していることを確認してください。

構成ファイルでcgroupの制限を変更したら、変更を有効にするためにコンテナーをシャットダウンして再起動する必要があります。

または、 lxc-cgroup コマンドを使用して、実行中のコンテナーに一時的に制限を設定できます。

lxc-cgroup -n test-container cpu.shares 100

自動スタート

特にコンテナがサービスをホストしている場合は、再起動後にコンテナを自動起動することがよくあります。 デフォルトでは、コンテナは、シャットダウン前に実行されていたとしても、再起動後に開始されません。

コンテナを自動起動するには、その設定ファイルを / etc / lxc /autoディレクトリにシンボリックリンクする必要があります。

ln -s /var/lib/lxc/test-container/config /etc/lxc/auto/test-container.conf

lxc-ls –fancy を再度実行すると、コンテナが自動起動するように設定されていることがわかります。

# lxc-ls --fancy
NAME            STATE    IPV4        IPV6  AUTOSTART
----------------------------------------------------
test-container  RUNNING  10.0.3.143  -     YES

コンテナを破壊する

コンテナの使用が終了したら、システムからコンテナを削除してディスク領域を解放できます。 まず、コンテナがlxc-shutdownで停止していることを確認します。

lxc-shutdown -n test-container

これにより、コンテナを安全にシャットダウンしようとします。 lxc-shutdownlxc-stopに置き換えると、コンテナーが即座に終了します。これは、実際のマシンの電源プラグを抜くのと似ており、データが破損した状態になる可能性があります。 したがって、 lxc-shutdown が失敗した場合にのみ、lxc-stopを使用してください。

停止してコンテナに保持したいデータがないことを確認したら、lxc-destroyで破棄できます。

lxc-destroy -n test-container

概要

これは、LXCコンテナーの基本的なライフサイクルと、それらがセットアップにどのように役立つかを示しています。 さらにアドバイスや支援が必要な場合は、以下にコメントを残してください。