barge(on Vagrant)にDocker環境を構築する

使い捨てのDocker環境を簡単に構築するために、Docker for macではなく、Vagrant上に軽量OSのbargeを稼動させた上でdockerを起動する。

なお個人的に、当該環境に、LAMP環境を構築することを考えている。
このためDocker上で動いているWebサーバやMySQLにもホスト側から接続できるようにする。

本記事にはDockerの設定までは載せていないが、下記のような感じでポートフォワードする予定。

|         |ホスト|barge|Docker|
|:--      |:--   |:--  |:--   |
|Webサーバ|10080 |80   |80    |
|MySQL    |13306 |3306 |3306  |

## ホスト

* macOS Sierra

# vagrantでbarge環境の準備

## boxをインポート

vagrantで利用するboxはbarge公式のもの。

  * https://atlas.hashicorp.com/ailispaw/boxes/barge

``` shell
% vagrant box add ailispaw/barge
% vagrant init -m ailispaw/barge
% mkdir export
```

## Vagrantfileの作成

``` ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ailispaw/barge"

  config.vm.network "forwarded_port", guest: 80,   host: 10080
  config.vm.network "forwarded_port", guest: 3306, host: 13306

  # フォルダの同期：開発環境なのでパーミッションを777に設定してしまう。
  config.vm.synced_folder "./export", "/home/bargee/common", mount_options: ['dmode=777', 'fmode=777']
end
```

## bargeの起動

``` shell
% vagrant up
% vagrant ssh
```

# barge環境のセットアップ

## dockerのバージョンを最新版にすると共に、docker-composeをインストールする。

``` shell
vagrant> docker version
vagrant> sudo /etc/init.d/docker restart v1.12.6

vagrant> wget -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-`uname -s`-`uname -m`
vagrant> chmod +x docker-compose-`uname -s`-`uname -m`
vagrant> sudo mv docker-compose-`uname -s`-`uname -m` /opt/bin/docker-compose
vagrant> sudo chown root:root /opt/bin/docker-compose
```

## ssh経由でのコマンド実行時用に環境変数を設定

ssh経由でコマンドを実行したときにbashでssh先の環境変数設定が有効にならないので、環境変数を設定できるようにする。

``` shell
vagrant> sudo vi /etc/ssh/sshd_config
差分は以下
- #PermitUserEnvironment no
+ PermitUserEnvironment yes

# ssh用の環境変数の設定で「/opt/bin」を追加($PATHで変数展開されないので全てベタ書きする)
vagrant> vi ~/.ssh/environment
PATH=/opt/bin:/bin:/sbin:/usr/bin:/usr/sbin

# sshdの再起動
vagrant> sudo /etc/init.d/S50sshd restart
```

## ホスト側にssh設定を追加

~/.ssh/configに以下の出力を追加

``` shell
% vagrant ssh-config --host dockerDev
```

ホスト側で、以下のようにdockerのコマンド実行もできる。

``` shell
% ssh dockerDev 'docker run --name php-apache-tmp php:5.6-apache true'
```

# bargeメモ

## パッケージ

以下のコマンドでパッケージのインストールが可能

``` shell
% pgk install [package name]
```

パッケージシステムは以下のものを利用している。

  * https://github.com/bargees/barge-pkg

## 環境変数が展開されない?

※本項目は、コメントで指摘があったように、下記コマンドで問題なく起動できました。
A-Iさん、情報ありがとうございました。

``` shell
% docker run -d --name laravel -e "PATH=${PATH}:/usr/local/bin" -p 80:80 php:5.6-apache
```

### 以下、指摘前の情報

以下のように環境変数を渡してもPATHが展開されず起動できなくなる。

``` shell
% docker run -d --name laravel -e "PATH=${PATH}:/opt/bin" -p 80:80 php:5.6-apache

docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"docker-php-entrypoint\\\": executable file not found in $PATH\"\n".
```

上記の場合、元々のPATHの末尾に`/opt/bin`を追加しようとしているが、PATHが展開されずに記載した文字列がそのまま格納されている模様。
`docker-php-entrypoint`というファイルは、`/usr/local/bin/`に入っているが、PATHが変な風に上書きされたので、パス知らないってことでエラーになっている。
Docker for macでは問題なかったのでbarge特有の問題なのか?(詳細不明。要調査)

ちなみに、以下のように手動でPATHを展開しておけば問題なく起動できた。

``` shell
% docker run -d --name laravel -e "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.composer/vendor/bin" -p 80:80 php:5.6-apache
```

# 参考にさせて頂いたサイト

  * http://qiita.com/A-I/items/8dc7ddc52e6038b5c74b