LoginSignup
39
26

More than 5 years have passed since last update.

MINCS (Mini Container Shellscripts) 解説

Posted at

これは何か

コンテナの仕組みを理解するためのシェルスクリプトとして開発している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にはなんでもあります:wink:

 $ 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でコンテナイメージをまとめて、自己実行型のコンテナを作る


  1. ただしQemuコンテナ機能を使うためには、カーネルなどをビルドする必要があります。 

39
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
26