Barge(Docker ホスト用軽量 OS)って?

  • 337
    いいね
  • 0
    コメント

Barge
気軽に Docker を使いたい人向けの軽量な Docker ホスト(VM)用 Linux OS です。
Only-Docker → RancherOS-Lite → DockerRoot → Barge と変遷してきています。
(最後に Barge になったのは、Docker 社が他社製品名の先頭に Docker を使用することを禁止しているため)

Barge は、以下のような特徴を持っています。

  • 最軽量
  • 高速ブート
  • Docker のバージョンを切り替え可能
  • glibc、bash、dumb-init を標準搭載
  • パッケージ・インストーラ
  • Vagrant 用 Box
  • VirtualBox に最適化
  • Raspberry Pi 3 のサポート

最軽量

以前、メモ:Docker ホスト用軽量 OS の比較 - Qiita でもご紹介させて頂いたんですが、なんとか未だに 13MB をキープしております。

Docker の良さである軽量、高速起動のはずが、ホスト OS(VM)のダウンロードの時点で挫けそうになったのは私だけではないはず。
この軽さはカーネルとファイルシステムの展開スピードにも影響して来ます。

高速ブート

バグ修正や最適化を続けた結果、カーネルのロードからプロンプトが表示されるまでは、わずか4秒に。

Alpine Linux Virtual (29MB)の6秒を超える結果になりました。
Vagrant + VirtualBox で起動した場合でも、VM の起動から SSH のコネクション確立までは約6秒、全体でも約15秒で vagrant up が完了します。

Docker をサクッと使いたい時にサクッと起動させる。ストレス無しです。

Docker のバージョンを切り替え可能

初期状態では Docker のバージョンは v1.10.3 を搭載していますが、必要に応じてバージョンの切り替えが出来るようになっています。

VM を再作成/再起動することも無く、
sudo /etc/init.d/docker restart v1.13.1
と打つだけで Docker v1.13.1 に切り替わります。

さらに、RC 版にも対応!
boot2dockerDocker for Mac/Windows のリリースを待つこと無く、Docker Engine のリリースと同時にすぐにテストが開始出来ます。

ちなみに、Docker v1.10.3 は、単一バイナリの最後のバージョンで、軽量な上、docker-compose v2 にも対応しているので、デフォルトに採用しています。

glibc、bash、dumb-init を標準搭載

軽量でありながら、押さえるところは押さえる。

軽量な uClibc、musl libc では無く、敢えて glibc で Linux バイナリの互換性を高めています。
また、busybox の sh/ash では無く、bash を搭載することで Terminal での操作も楽ちん。
Docker コンテナの init には欠かせない、軽量な dumb-init も標準装備です。
↓こんな感じ。
docker run -d -v /usr/bin/dumb-init:/dumb-init:ro --entrypoint=/dumb-init <image> <command>

これら以外にも Buildroot のパッケージから必要最小限のユーティリティを搭載しています。
https://github.com/bargees/barge-os/blob/master/README.md#features

パッケージ・インストーラ

アプリケーションの実行は Docker におまかせ!
とは言え、はやり、ホスト側に git や make、(標準の busybox の vi ではなく)vim があれば楽ですよね。
criuipvsadmbindfssu-exec 等の Docker を補完するツールも欲しいです。

そこで、Docker を利用して、Barge のビルド時と同じ環境の Docker イメージを用意し、Buildroot の膨大なパッケージ群の中から、いつでも好きなパッケージを個別にビルド、インストール出来るツールを作成しました。
https://github.com/bargees/barge-pkg

さらに、本来 Buildroot には無い、criu、ipvsadm、bindfs や su-exec 等も extra パッケージとして加えてあります。
https://github.com/bargees/barge-pkg/tree/master/extra/package

一度作成したパッケージは保存されて再利用出来ますし、事前にビルドしたパッケージを集めたリポジトリもご用意。リポジトリにあるパッケージはビルドする必要は無く、自動的にダウンロードして、インストールされます。
https://github.com/bargees/barge-pkg/releases

Vagrant 用 Box

Vagrant の便利さはもう説明が要らないと思います。
最近はデグレードも多く不安定ですが、まだまだ使えます。
何と言っても、

  • VM の作成/破棄が気軽に出来ること。
  • 環境の共有/再現が簡単に出来ること。

が大きいです。

Barge も Vagrant 用 box を標準で提供。
https://atlas.hashicorp.com/ailispaw/boxes/barge

Docker provisioner の利用、Port Forward の設定、Private Network の設定、Shared Folder の設定等々、Vagrant の機能をそのまま利用することが出来ます。

また、Docker for Mac/Windows では出来ない、複数 VM の起動や連携、Vagrantfile で環境自体の共有が可能です。

VirtualBox に最適化

VirtualBox は重いし使えない子、と言われることが多いですが、やはり、フリーで、かつ Mac/Windows を問わず、同じ環境を共有できるメリットは大きいと思います。

とは言え、VirtualBox Shared Folder (vboxsf) には致命的な問題もありますので、Vagrant 版の Barge では独自に GuestAdditions にパッチを当てて対処しています。
https://github.com/bargees/barge-packer/tree/master/virtualbox/iso/patches

特に転送速度はリード/ライト共に標準の2倍〜5倍の転送速度を実現しています。

Mac のような NFS が簡単に使える環境の方は NFS の方がもちろん速いですが、
軽量なアプリを Mac/Windows で環境を共有する必要がある場合は vboxsf も選択肢としてありかなと思っています。

Raspberry Pi 3 のサポート

最近 Docker 界隈でも話題になっている Raspberry Pi
Docker から公式に ARM 版バイナリの提供も始まりましたし、
resin.ioHyproitOS も ARM 環境での Docker をサポートしています。

ただ、やはり大きいですよ、イメージが。
ここは Barge も使えるようにしてみようと、最近サポートを開始しました。

VM では必要なかった各種デバイス・ドライバを含めても 32MB と軽量で、SD Card への書き込みも数秒。
VM 版と同様に高速に起動しますし、軽量なので SD Card の残りスペースも Docker 用に十分に確保出来ます。
また、ファイルシステムが RAM に展開されるので SD Card に優しいです。

https://github.com/bargees/barge-os/releases/tag/2.5.4-rpi
https://github.com/bargees/barge-rpi-contrib

今後の課題や検討事項

  • Cloud 対応
    現状でも Cloud 上の VM で利用できるとは思いますが、最初のコンフィグレーションには cloud-init の対応が必須だろうと思っています。
  • Bare Metal 対応
    Cloud 対応と同様ですが、Raspberry Pi や Bare Metal でもコンフィグレーションを容易にするために、device-init のようなツールの搭載を考えています。
  • Docker 最新版の標準搭載
    Docker v1.12 から overlay2 が利用可能になりましたので、それが速度、安定性共に良いようであれば、サイズを犠牲にしても入れる価値があるか検討したいです。
  • バグや機能不足の洗い出し
    利用状況が限定的な現状では問題発生への対応は簡単ではありますが、レアなケースを含めて全てを洗い出すことは不可能ですし、アイデアも限られます。出来ればより多くの人に多様な使い方をしてもらいながら、良いものに出来ればと思っています。

リンク集

サンプル

Barge ご利用のプロジェクト