現在、次の有名なコンテナ実装が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.conflxc.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はコンテナの外部にマウントされたポイントを表示し、時刻を設定する呼び出しはコンテナの外部を変更します。 さらに、使用済みディスク領域のクォータはなく、プロセッサの使用にハード制限はありません。 クォータの作業は現在進行中であるため、近い将来、コンテナを作成するためにカーネルにパッチを適用する必要がなくなることを願っています。