#これは何か
コンテナの仕組みを理解するためのシェルスクリプトとして開発しているMINCSの基本機能概要です。
#MINCS概要
MINCSは所謂Linuxコンテナを作るシェルスクリプトです。
##MINCSの特徴
- 名前空間の切り出し、overlayfsによる階層型ルートファイルシステムの準備、/procや/devの準備、chrootによるコンテナ内への移行などが主な機能です。
- Docker likeなイメージの管理機能や、squashfsを用いた自己実行型のコンテナイメージ作成機能などもあります。
- Clear Container的なqemuを用いた仮想マシン混合コンテナも作れます。
- MINCSはPOSIX互換シェルスクリプトなのでbusyboxでも動かせます。
- シェルスクリプトなので非常に小さいです。
##MINCSのインストール
シェルスクリプトなのでビルドやインストールする必要はなく1、ダウンロードしたスクリプトを実行するだけです。
$ git clone https://github.com/mhiramat/mincs.git
$ cd mincs
$ ./minc --help
./minc - Run given command in a temporary namespace
...
##MINCSの使い方
詳細はREADME.mdを参照してください。
完全な機能を持ったmincの実行にはroot権限が必要な点も注意が必要です。(限定的に非特権ユーザとして実行することも可能です)
$ sudo ./minc
/#
これで現在使っているルートファイルシステムをベースにしたコンテナ空間でシェルが立ち上がった状態になります。試しにps -ef
コマンドを実行してみましょう。シェルがPID1で動いていることがわかります。
/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:49 ? 00:00:00 /bin/bash
root 76 1 0 13:49 ? 00:00:00 ps -ef
また、mountコマンドを使うと、ルートファイルシステムがoverlayfsに変わっていることがわかります。
/# mount
overlayfs on / type overlay (rw,relatime,seclabel,lowerdir=/,upperdir=/tmp/minc2591-MysBjw/storage,workdir=/tmp/minc2591-MysBjw/work)
このため、内部でかなり無茶をしても安全です。
/# rm -rf *
...
/# ls
bash: ls: command not found
/# exit
$ ls /
bin dev home lib64 media opt root sbin sys usr
boot etc lib lost+found mnt proc run srv tmp var
###ルートファイルシステムの指定
mincに-r <rootdir>
を渡すことで、chrootのように指定したディレクトリをルートファイルシステムとしてコンテナを実行できます。
$ sudo ./minc -r ./debian
root@localhost:/# cat /etc/debian_version
8.6
ルートファイルシステムを作るにはdebootstrapが使えます。なに?CentOSやFedoraのルートファイルシステムが欲しい?docker exportを使いましょう。dockerhubにはなんでもあります。
$ sudo docker run --name=alpine alpine:latest echo exit
exit
$ mkdir alpine
$ sudo docker export alpine | tar -xC alpine/
$ sudo ./minc -r alpine sh
/ # cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.4.4
PRETTY_NAME="Alpine Linux v3.4"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
###ローカルディレクトリのバインド
mincの起動時に-b <hostdir>:<dir>
を渡してローカルディレクトリをコンテナにバインドマウントすることが出来ます。
$ echo hello minc world > hello.txt
$ sudo ./minc -r alpine -b ./:/opt cat /opt/hello.txt
hello minc world
MINCSで出来ていないこと
- TTYのアタッチやデタッチ(これは何らかのタスクを立ち上げておかないと無理っぽい。多分tmuxと連携すればいいのだけど・・・)
- ネットワーク名前空間の設定(pipeworkがあるので、これが使えるはず)
- Seccomp対応などのセキュリティ機能
- その他諸々(実際色んな機能が適当)
MINCSの変わった機能
MINCSでは他のコンテナの機能の発表に合わせて、「へー、こういうのがあるんだ。試してみよう」の精神でお試し機能を追加しています。
- ホストのX11のunix socketをバインドして、GUIアプリをコンテナで動かす
- qemu-user-modeを利用して、他のアーキテクチャのバイナリ(ルートファイルシステム)を実行できるようにする
- 非特権ユーザでもコンテナを実行できるようにする
- 内部でqemu-systemを立ち上げて、コンテナを仮想マシンで動かす
- コンテナ内のアプリ動作に必要なファイルだけ残したファイルシステムを作り、squashfsでコンテナイメージをまとめて、自己実行型のコンテナを作る
-
ただしQemuコンテナ機能を使うためには、カーネルなどをビルドする必要があります。 ↩