lxc-ネイティブLinuxコンテナー

現在、次の有名なコンテナ実装がLinuxに存在します。



ただし、必要な機能を取得するには、カーネルにパッチを適用する必要があります。 それらとは異なり、カーネルバージョン2.6.29はこれを必要としないため、 lxc 。 分離を実装するには、カーネルにすでに存在する名前空間を使用し、 コントロールグループを使用してリソースを管理します。 これにより、完全な分離環境を作成できるだけでなく、個々のアプリケーションを分離することもできます。 lxcでの作業を開始するには、カーネル2.6.29で実行中のLinux 必要です。 この場合、カーネルで次のオプションを有効にする必要があります。



* General setup

** Control Group support

---> Namespace cgroup subsystem

---> Freezer cgroup subsystem

---> Cpuset support

----> Simple CPU accounting cgroup subsystem

----> Resource counters

----> Memory resource controllers for Control Groups

** Group CPU scheduler

---> Basis for grouping tasks (Control Groups)

** Namespaces support

---> UTS namespace

---> IPC namespace

---> User namespace

---> Pid namespace

---> Network namespace

* Security options

--> File POSIX Capabilities

* Device Drivers

** Network device support

---> Virtual ethernet pair device







これがすべて含まれている場合は、cgroupファイルシステムをマウントします。

mkdir -p /var/lxc/cgroup

mount -t cgroup cgroup /var/lxc/cgroup







lxcをダウンロードし、 ビルドしてインストールします:

./configure --prefix=/

make

make install







次に、iproute2のどのバージョンがインストールされているかを確認します。 2.6.26以降のバージョンが必要です。 このバージョンでは、仮想ネットワークデバイスを管理し、ネットワーク名前空間を構成できます。 さらに、コンテナ内でネットワークを使用する予定がある場合は、ブリッジモードを使用するようにネットワークシステムを再構成する必要があります。 これを行うには、ネットワークインターフェイスを省略します。

ifconfig eth0 down







ブリッジbr0を作成します。

brctl addbr br0

brctl setfd br0 0







ネットワークインターフェイスを接続します。

brctl addif br0 eth0

ifconfig eth0 0.0.0.0 up







アドレスをbr0に設定し、デフォルトゲートウェイを記述します。

ifconfig bdr0 192.168.1.2/24 up

route add default gw 192.168.1.1







さらに、コンテナが起動すると、特別な仮想デバイスが作成され、ブリッジがコンテナの仮想インターフェイスに接続されます。 ここで、コンテナのシステムイメージが必要です。 最も簡単な方法は、OpenVZの既製のテンプレートを使用することです。 CentOSテンプレートを使用しました。 / var / lxc / centos / rootfsディレクトリにダウンロードして解凍します 。 その後、OpenVZで動作するように設計されているため、テンプレートをわずかに変更する必要があります。 これを行うには、次の手順を実行します。



/var/lxc/centos/rootfs/etc/rc.dディレクトリに移動し、rc.sysinitファイル内の次の行をコメントアウトします。

/sbin/start_udev

mount -n /dev/pts >/dev/null 2>&1







現在、/ devは現在のシステムのバインドを使用してマウントされています。



次に、fstabファイルの/ var / lxc / centos / rootfs / etc /ディレクトリーでコメントアウトし、次の行をコメントアウトします。

none /dev/pts devpts rw 0 0







その後、/ var / lxc / centos / rootfs / etc / sysconfig / network-scriptsディレクトリに移動し、次のようなifcfg-eth0ファイルを作成します。

DEVICE=eth0

IPADDR=192.168.1.102

NETMASK=255.255.255.0

NETWORK=192.168.1.0

BROADCAST=192.168.1.255

ONBOOT=yes

NAME=eth0







次に、/ var / lxc / centos / rootfs / etc / sysconfig /ディレクトリに移動して、ネットワークファイルを作成します。

NETWORKING="yes"

GATEWAY="192.168.1.1"

HOSTNAME="centos_ssh"







これで、rootパスワードの変更が残ります。 これを行うには、システムイメージにchrootを作成し、passwdを呼び出します。

chroot /var/lxc/centos/rootfs

passwd









システムの準備が完了したら。 コンテナ設定の作成に移りましょう。 これを行うには、ディレクトリ/ var / lib /に2つのファイルfstabとlxc-centos.confを作成します

次に、コンテナ設定ファイルを作成する必要があります。 / var / lxc / centos lxc-centos.confおよびfstabディレクトリに次のコンテンツを作成します。

lxc-centos.conf

lxc.utsname = centos_ssh

lxc.network.type = veth

lxc.network.flags = up

lxc.network.link = br0

lxc.network.ipv4 = 192.168.1.101/24

lxc.network.name = eth0

lxc.mount = /var/lxc/centos/fstab

lxc.rootfs = /var/lxc/centos/rootfs







fstab

/dev /var/lxc/centos/rootfs/dev none bind 0 0

/dev/pts /var/lxc/centos/rootfs/dev/pts none bind 0 0







これで、コンテナを作成できます。 CentOSの名前と構成ファイルを指定します。

lxc-create -n centos -f /var/lxc/centos/lxc-centos.conf







コンテナが作成されたかどうかを確認します。

lxc-info -n centos

'centos' is STOPPED







コンテナは作成されましたが、現時点では機能しません。 実行してください:

lxc-start -n centos







centosのダウンロードを開始します。 すぐに:

INIT: no more processes left in this runlevel







ダウンロードが完了しました。 隣接するコンソールを開き、コンテナに割り当てられたアドレスにpingを試してください。 pingされるとすぐに、ssh経由でログインできます。



ただし、本格的なコンテナに加えて、lxcではアプリケーションコンテナを作成できます。 これを行うには、/ var / lxc / simpleディレクトリに次のディレクトリ構造を作成します。

rootfs

|-- bin

|-- dev

| |-- pts

| `-- shm

| `-- network

|-- etc

|-- lib

|-- proc

|-- root

|-- sbin

|-- sys

|-- usr

`-- var

|-- empty

|-- lib

| `-- empty

`-- run







次に、 lxc-simple.confを作成します。

lxc.utsname = simple

lxc.mount = /var/lxc/simple/fstab

lxc.rootfs = /var/lxc/simple/rootfs







およびfstab

/lib /var/lxc/simple/rootfs/lib none ro,bind 0 0

/bin /var/lxc/simple/rootfs/bin none ro,bind 0 0

/usr /var/lxc/simple/rootfs/usr none ro,bind 0 0

/sbin /var/lxc/simple/rootfs/sbin none ro,bind 0 0







次に、コンテナを作成します。

lxc-create -n simple -f /var/lxc/simple/lxc-simple.conf









そして、アプリケーションを実行します。

lxc-execute -n centos /bin/ls









ご覧のとおり、一方ではアプリケーションを使用してコンテナを作成する方が、完全なコンテナを作成するよりも簡単であり、複雑です。 これで、1つの実行中のコンテナーと1つのアプリケーションコンテナーが停止状態になりました。 しかし、コンテナは、分離に加えて、リソースを制限できる必要があります。 これを行うために、lxcはlxc-cgroupを使用します。 現時点では、どのプロセッサを使用するか、どのプロセッサ時間を割り当てるか、利用可能なメモリ制限、さらに処理するためにコンテナから送信されるネットワークトラフィックのクラスを指定できます。 すべての設定はcgroupに基づいています。設定の詳細なレビューについては、 Documentation / cgroups core documentationディレクトリを参照してください。



簡単な例を挙げましょう。 コンテナを最初のプロセッサコアにバインドします。

lxc-cgroup -n centos cpuset.cpus 0









最大128MBのコンテナメモリ制限:

lxc-cgroup -n centos memory.limit_in_bytes 128M









さらに、さまざまなアカウンティングパラメータがあります。 直接、lxc-cgroupなしのこれらすべては、/ var / lxc / cgroup / centosディレクトリで表示できます。



コンテナが不要な場合は、停止できます。

lxc-stop -n centos









そして削除:

lxc-destroy -n centos







コンテナは削除されますが、システムイメージはディスクに残ることに注意してください。



lxc-psを使用して実行中のプロセスを表示できます。

lxc-ps --lxc

centos 7480 ? 00:00:00 init

centos 7719 ? 00:00:00 syslogd

centos 7736 ? 00:00:00 sshd









lxc-infoはコンテナのステータスを表示します:

lxc-info -n centos

'centos' is RUNNING









lxc-freezeは、lxc-unfreezeが呼び出されるまでコンテナ内のすべてのプロセスをブロックします

lxc-freeze -n centos









lxc-unfreezeはコンテナ内のすべてのプロセスのロックを解除します

lxc-unfreeze -n centos









lxcは興味深い技術ですが、現時点では本番環境で使用する準備ができていません。 絶縁は明らかに不十分です。 そのため、コンテナ内のtopはすべてのプロセッサとすべてのメモリを表示し、mountはコンテナの外部にマウントされたポイントを表示し、時刻を設定する呼び出しはコンテナの外部を変更します。 さらに、使用済みディスク領域のクォータはなく、プロセッサの使用にハード制限はありません。 クォータの作業は現在進行中であるため、近い将来、コンテナを作成するためにカーネルにパッチを適用する必要がなくなることを願っています。



All Articles