Dockerを調べていたら、下位レイヤであるLXCやcgroupに興味が出てきたので少し調べました。
まだ触ってみたくらい。
What is LXC?
- LinuX Containerの略で、システムのコンテナ化を行なうための機構
- OSレベルで提供されている
- Linux kernelの機構であるcgroups/namespaceなどに依存している
- 低レイヤな機構であるcgroupsなどをとりまとめる中間レイヤ的な側面を持つが、さらに高レイヤのDockerから利用されることが多い
- 同様の技術にFreeBSD jailやSolaris Containersなど
How to use
以下でインストール。
ubuntu@ubuntu:~$ sudo apt-get install lxc
以下がテンプレートとして用意されている。
ubuntu@ubuntu:~$ ls -l /usr/lib/lxc/templates/
total 88
-rwxr-xr-x 1 root root 8227 Oct 29 2013 lxc-busybox
-rwxr-xr-x 1 root root 9806 Oct 29 2013 lxc-debian
-rwxr-xr-x 1 root root 10520 Oct 29 2013 lxc-fedora
-rwxr-xr-x 1 root root 9094 Oct 29 2013 lxc-opensuse
-rwxr-xr-x 1 root root 5115 Oct 29 2013 lxc-sshd
-rwxr-xr-x 1 root root 19736 Oct 29 2013 lxc-ubuntu
-rwxr-xr-x 1 root root 10590 Oct 29 2013 lxc-ubuntu-cloud
Debianをインストールしてみる。
十分以上かかるので注意。
ubuntu@ubuntu:~$ sudo lxc-create -t debian -n debian0
No config file specified, using the default config
debootstrap is /usr/sbin/debootstrap
Checking cache download in /var/cache/lxc/debian/rootfs-squeeze-i386 ...
Downloading debian minimal ...
I: Retrieving Release
W: Cannot check Release signature; keyring file not available /usr/share/keyrings
/debian-archive-keyring.gpg
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
...
一覧を表示すると存在している。
ubuntu@ubuntu:~$ sudo lxc list
RUNNING
FROZEN
STOPPED
debian0
開始してみる。
ubuntu@ubuntu:~$ sudo lxc start debian0
INIT: version 2.88 booting
...
Starting OpenBSD Secure Shell server: sshd.
Debian GNU/Linux 6.0 debian0 console
debian0 login: root
Password:
Linux debian0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@debian0:~#
distributionは異なっているが、同一カーネル上で動作していることが分かる。
ubuntu@ubuntu:~$ uname -a
Linux ubuntu 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux
root@debian0:~# uname -a
Linux debian0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 GNU/Linux
ちなみに、以下のコマンドでfedoraをインストールすることもできるが、debianの場合と比較して時間がかかる。1時間くらいかかるかも。
ベースシステムの相違が大きいため、いろんなrpmを別途インストールする必要があるためぽい。
ubuntu@ubuntu:~$ sudo lxc-create -t fedora -n fedora0
No config file specified, using the default config
...
'fedora' template installed
'fedora0' created
ubuntu@ubuntu:~$ sudo lxc-start -n fedora0
Fedora release 14 (Laughlin)
Kernel 3.2.0-24-generic-pae on an i686 (tty1)
fedora0 login: root
Password:
Last login: Tue Jul 15 01:01:39 on console
[root@fedora0 ~]# uname -a
Linux fedora0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux
What is cgroups?
- リソースの制限
- グループ単位でメモリ割り当てを制限
- 優先順位の変動
- グループ単位でCPU, Disk I/Oの優先順位を変更
- 監視
- グループ単位で使用しているリソースを計上
- 各グループは階層構造を持つ
- 子グループは親グループの属性を一定引き継ぐ
なお、以前のバージョンだとnamespaceの分離もcgroupが対応していたようですが、消されました。
namespaceはカーネルの機能として独立した、ということかな。
How to use
リソース制限についてやってみる。
まずはインストール。
$ sudo apt-get install cgroup-bin
関連コマンドは
cgcreate
cgexec
cgclassify
cgroupを作成。メモリとCPUのリソースを制限できるようにする。
$ sudo cgcreate -g memory,cpu:test
下記のsysfsで確認できる。
$ ls -l -l /sys/fs/cgroup/cpu/test/
total 0
-rw-r--r-- 1 root root 0 Jul 15 13:17 cgroup.clone_children
--w--w--w- 1 root root 0 Jul 15 13:17 cgroup.event_control
-rw-r--r-- 1 root root 0 Jul 15 13:17 cgroup.procs
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.shares
-r--r--r-- 1 root root 0 Jul 15 13:17 cpu.stat
-rw-r--r-- 1 root root 0 Jul 15 13:17 notify_on_release
-rw-r--r-- 1 root root 0 Jul 15 13:17 tasks
指定cgroupでプロセスを起動。
$ sudo cgexec -g memory,cpu:test /bin/bash
指定cgroupに属していることが分かる。
# cat /proc/self/cgroup
5:freezer:/sysdefault
4:memory:/test
3:devices:/sysdefault
2:cpuacct:/sysdefault
1:cpu:/test
CPU共有の優先度を指定可能。100で10%。
# cat /sys/fs/cgroup/cpu/test/cpu.shares
1024
# echo 100 >/sys/fs/cgroup/cpu/test/cpu.shares
メモリ使用量の制限。これ以上のメモリを確保しようとするとスワップアウトする。
# cat /sys/fs/cgroup/memory/test/memory.limit_in_bytes
9223372036854775807
# echo $((1024*1024)) >/sys/fs/cgroup/memory/test/memory.limit_in_bytes
統計情報も見える。
cat /sys/fs/cgroup/cpu/test/cgroup.procs
9239
# ps auxw | grep 9239
root 9239 0.0 0.4 6960 2216 pts/1 S 13:35 0:00 /bin/bash
Docker / LXC / cgroups
なんだか似たようなシステムに思えるけど、結局これらの関係ってどうなってるの? という疑問についてはこちらが詳しい。
- Dockerは下位レイヤとしてLXCを利用する
- コンテナの可搬性(LXCでは環境が異なるとコンテナの互換性がない)
- アプリの配布に最適化している
- 自動ビルド(Dockerfile)
- バージョン管理
- コンテナ再利用
- コンテナ共有
- 様々なツール/システムとの連携
機能別に分類すると、
- ファイルシステムの分離
- LXC(namespace)が提供
- リソースの分離
- LXC(cgroup)が提供
- ネットワークの分離
- LXC(cgroup)が提供
- ファイルシステムのCopy on Write
- AUFSが提供
- ロギング
- Dockerが提供
- ファイルの変更管理と再利用
- Dockerが提供
- 対話的シェル
- LXCが提供