Barge（Docker ホスト用軽量 OS）って？

![Barge](https://cloud.githubusercontent.com/assets/10327896/18331486/2ffa9ec0-7514-11e6-9e2a-be3d69a092bc.png)
気軽に Docker を使いたい人向けの軽量な Docker ホスト（VM）用 Linux OS です。
Only-Docker → RancherOS-Lite → DockerRoot → Barge と変遷してきています。
（最後に Barge になったのは、Docker 社が他社製品名の先頭に Docker を使用することを禁止しているため）

[Barge](https://github.com/bargees/barge-os) は、以下のような特徴を持っています。

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

## 最軽量

以前、[メモ：Docker ホスト用軽量 OS の比較 - Qiita](http://qiita.com/A-I/items/3d2aedbad4f10141cef3) でもご紹介させて頂いたんですが、なんとか未だに **15MB** をキープしております。

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

## 高速ブート

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

[Alpine Linux](https://www.alpinelinux.org/) Virtual （29MB）の６秒を超える結果になりました。
Vagrant + VirtualBox で起動した場合でも、VM の起動から SSH のコネクション確立までは約７秒、全体でも約16秒で `vagrant up` が完了します。

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

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

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

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

さらに、RC 版にも対応！
[boot2docker](http://boot2docker.io/) や [Docker for Mac/Windows](https://www.docker.com/products/docker) のリリースを待つこと無く、Docker Engine のリリースと同時にすぐにテストが開始出来ます。

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

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

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

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

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

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

アプリケーションの実行は Docker におまかせ！
とは言え、はやり、ホスト側に git や make、（標準の busybox の vi ではなく）vim があれば楽ですよね。
[criu](https://criu.org)、[ipvsadm](http://kb.linuxvirtualserver.org/wiki/Ipvsadm)、[bindfs](http://bindfs.org/) や [su-exec](https://github.com/ncopa/su-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](https://www.vagrantup.com/) の便利さはもう説明が要らないと思います。
最近はデグレードも多く不安定ですが、まだまだ使えます。
何と言っても、

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

が大きいです。

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

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

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

## VirtualBox に最適化

※ 最新の VirtualBox 用にはパッチは適用していません。

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

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

- VM 内で vboxsf 上のファイルの変更が正しく反映されない問題  
https://github.com/ailispaw/docker-root-packer/issues/2
- vboxsf 上のホスト↔ VM 間のファイル転送バッファを最大にして転送速度の改善

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

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

## Raspberry Pi 3 のサポート

※ 現在 Raspberry Pi のサポートは停止しています。

最近 Docker 界隈でも話題になっている [Raspberry Pi](https://www.raspberrypi.org/)。
Docker から公式に ARM 版バイナリの提供も始まりましたし、
[resin.io](https://resin.io/) や [HyproitOS](http://blog.hypriot.com/) も 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](https://cloudinit.readthedocs.io) の対応が必須だろうと思っています。
- Bare Metal 対応  
Cloud 対応と同様ですが、Raspberry Pi や Bare Metal でもコンフィグレーションを容易にするために、[device-init](https://github.com/hypriot/device-init) のようなツールの搭載を考えています。
- Docker 最新版の標準搭載  
Docker v1.12 から [overlay2](https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/#/image-layering-and-sharing-with-overlayfs-overlay2) が利用可能になりましたので、それが速度、安定性共に良いようであれば、サイズを犠牲にしても入れる価値があるか検討したいです。
- バグや機能不足の洗い出し  
利用状況が限定的な現状では問題発生への対応は簡単ではありますが、レアなケースを含めて全てを洗い出すことは不可能ですし、アイデアも限られます。出来ればより多くの人に多様な使い方をしてもらいながら、良いものに出来ればと思っています。

## リンク集

- https://github.com/bargees/barge-os  
Barge OS のビルド環境
- https://github.com/bargees/barge-pkg  
パッケージ・インストーラとパッケージ・リポジトリ
- https://github.com/bargees/barge-packer  
Vagrant 用 box と QEMU 用 qcow2 イメージ
- https://github.com/bargees/barge-docker-image  
Barge OS の Docker イメージ
- https://github.com/bargees/barge-xhyve  
xhyve hypervisor 用 Barge 環境の作成ツール 
- https://github.com/bargees/barge-rpi-contrib  
Raspberry Pi 版 Barge の補助ユティリティ
- https://github.com/bargees/armhf-docker  
ARM 版 Docker Engine のビルドファイル
- https://app.vagrantup.com/ailispaw/
- https://hub.docker.com/u/ailispaw/

### サンプル

- https://github.com/ailispaw/swarm-barge  
Docker Swarm Mode クラスタの構築
- https://github.com/ailispaw/rexray-barge  
REX-Ray volume driver plugin の利用
- https://github.com/ailispaw/yapc-barge  
YAPC：Docker を利用しないコンテナ作成ツール
- https://github.com/ailispaw/rkt-barge  
rkt 実行環境の構築
- https://github.com/ailispaw/clair-barge  
Clair 実行環境の構築
- https://github.com/ailispaw/ubuntu-essential  
最小構成の Ubuntu Docker イメージのビルド
- https://github.com/bargees/barge-packer/blob/master/virtualbox/Vagrantfile  
vagrant-serverspec を利用した Barge Vagrant box のテスト
- https://github.com/bargees/barge-fstest  
vboxsf のバグ検証
- https://github.com/ailispaw/k3s-barge
k3s を利用した Kubernetes の環境構築

### Barge ご利用のプロジェクト

- https://wckr.github.io/  
Wocker: Docker を使って WordPress の開発環境を高速に作成するツール
- https://github.com/yappabe/vagrant-docker  
Vagrant + Docker による Web 開発環境
- https://github.com/aberresch/udre  
Vagrant + Docker + [Ansible](https://www.ansible.com/) を組み合わせた統合開発環境
- https://github.com/liteart/docker-suitecrm  
[SuiteCRM](https://suitecrm.com/) Docker イメージのビルド／実行環境