※ 本記事ではDockerやRailCar、LXC、Haconiwaなどの使用方法や実装については書いていない。

コンテナとは

  • Kernelの機能により、リソースが隔離・制限された空間
  • Kernelから見ると、ただのプロセス

namespace

Kernel/OSのリソースを隔離する。以下の項目についてnamespaceを分離できる。

  • ネットワーク(インターフェース、ルーティングテーブル、ソケットなど)
  • マウント(ファイルシステム)
  • UTS(ホスト名 uname(2)が返す値の集合)
  • IPC(セマフォ、MQ、共有メモリなどのプロセス間通信)
  • ユーザー(UID、GID)

cgroups

タスクをグループ化したり、そのグループ内のタスクに対して様々な物理リソースを制限する。以下の項目の使用量とアクセスを制限できる。

  • メモリ
  • ブロックデバイス(mmap可能なストレージとほぼ同義)
  • ネットワーク
  • /dev以下のデバイスファイル

コンテナ作成に関係するシステムコール

clone(2), unshare(2), chroot(2), pivot_root(2), mount(2)などを使用すれば、コンテナを作成できる。

chroot

プロセスから見えるファイルシステム自体を狭くする。カレントディレクトリをrootにし、pathの外のファイルが見えなくしている。

unshare

forckやcloneなどで子プロセスを作成する際に、指定した属性を共有しないようにできる。

コンテナ作成手順

※ Ubuntu 16.04.4 LTS で動作確認している。

debootstrap --arch amd64 jessie /var/lib/test_container/jessie-box http://ftp.jp.debian.org/debian
root@hoge:/home/hoge/src/github/rtc# ./target/debug/rtc 
root@test_container:/# pwd
/
root@test_container:/# hostname
test_container
root@test_container:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 20268 3304 ? S 13:26 0:00 /bin/bash -l
root 6 0.0 0.0 17504 2128 ? R+ 13:26 0:00 ps aux
root@test_container:/# cat etc/issue
Debian GNU/Linux 8 \n \l

軽量コンテナ

軽量コンテナの実装をいくつか挙げておく。普通の人がいきなりDockerの実装を読み切るのは困難であるため、学習する際は軽量なコンテナの実装から読み始めるのがよいと思われる。

参考書籍

  • ふつうのLinuxプログラミング
  • Linuxプログラミングインターフェース
  • Goならわかるシステムプログラミング
  • なるほどUnixプロセス ― Rubyで学ぶUnixの基礎

Software engineer

Software engineer