VirtualBox+Vagrant+Docker+HAProxy+MySQLでMySQLロードバランシングを実現する #1 準備編

AWSに適用する前に仮想環境でテストしたいと思ってこの構成にしました

Windowsで仮想環境を作りたいと先週Vagrantを使ってみましたが立ち上げ遅すぎワロタ～となってしまったので苦肉の策でVirtualBox上にVagrantでCentOS6.7を用意してその中にdocker-engineをインストールして爆速立ち上げ環境を作ってしまおうという意図の下、勤務中に書き上げたエントリーです。仕事は楽しい :dancers::dancers::dancers: 



#前提

立ち上げるVMはCentOS6.7でVagrantboxはこちらを使っています
https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box

ただ`vagrant up`した後に`yum update`を行うのでそれを`vagrant package`したものをベースとし、そのboxで生成したVM上にdocker-engineをインストールするのでそれもpackageしてそれを今回動作させるVMとして使用します

boxの派生イメージ的には
`centos6-7` : ダウンロードした状態のCentOS
:arrow_down: 
`centos6-7-yum-update` : CentOSにyum updateしただけ
:arrow_down:
`centos6-7-docker-engine` : docker-engineインストールした状態
となります
こまめに分割しているのはCentOS6.7ベースで他の事したい時にいちいちupdateすると時間の無駄になるからですね


今回はMySQLとPHPとHAProxyを使用したいのですがそれらはdockerコンテナとして起動します



#yum update状態のbox作成

`vagrant up`で何もしていないCentOSを立ち上げてください
※`vagrant init ~~`とvagrantfile編集は割愛します、全く分からない場合[ここ](http://qiita.com/TakashiOshikawa/items/d2fb48d59e9e316af9a2 "Windows上にVirtualBox+VagrantでCentOS環境構築")を見て`vagrant up`がキメられるようにしてください


おもむろに
`sudo yum update`
をかまします

```
[vagrant@localhost ~]$ sudo yum update

～～色々～～

  perl-version.x86_64 3:0.77-141.el6_7.1                          postfix.x86_64 2:2.6.6-6.el6_7.1
  procps.x86_64 0:3.2.8-35.el6_7                                  puppet-agent.x86_64 0:1.3.2-1.el6
  selinux-policy.noarch 0:3.7.19-279.el6_7.8                      selinux-policy-targeted.noarch 0:3.7.19-279.el6_7.8
  udev.x86_64 0:147-2.63.el6_7.1

Complete!
```

完了しました

この時点でbox`centos6-7-yum-update`を作成したいと思います

boxを作成するコマンドは
`vagrant package --output 作成するbox名`
です
`vagrant package`だけでもいいらしいですがbox名を指定したいのでオプションを付けています。

###現在のbox一覧
centos6-7というboxだけが存在しています

```
j5hhht1@J5HHHT1-PC /d/various/vagrant/centos6-7
$ vagrant box list
centos6-7 (virtualbox, 0)
```

###package実行
※packageを実行する時自動的に`vagrant halt`が実行されます、先にhaltしててもしなくてもどっちでもいいです

`vagrant package --output centos6-7-yum-update`
実行が完了するとカレントディレクトリに`centos6-7-yum-update`というboxファイルが生成されます

```
j5hhht1@J5HHHT1-PC /d/various/vagrant/centos6-7
$ vagrant package --output centos6-7-yum-update
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: d:/various/vagrant/centos6-7/centos6-7-yum-
update

j5hhht1@J5HHHT1-PC /d/various/vagrant/centos6-7
$ ls
Vagrantfile  centos6-7-yum-update
```


###boxの登録
先ほどpackageで生成したboxファイルを登録します
`vagrant box add box名 boxファイルPATH`
実行コマンド
`vagrant box add centos6-7-yum-update ./centos6-7-yum-update`

```
j5hhht1@J5HHHT1-PC /d/various/vagrant/centos6-7
$ vagrant box add centos6-7-yum-update ./centos6-7-yum-update
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos6-7-yum-update' (v0) for provider:
    box: Unpacking necessary files from: file://d:/various/vagrant/centos6-7/cen
tos6-7-yum-update
    box: Progress: 100% (Rate: 33.1M/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'centos6-7-yum-update' (v0) for 'virtualbox'!

j5hhht1@J5HHHT1-PC /d/various/vagrant/centos6-7
```


###登録されたか確認

```
j5hhht1@J5HHHT1-PC /d/various/vagrant/centos6-7
$ vagrant box list
centos6-7            (virtualbox, 0)
centos6-7-yum-update (virtualbox, 0)
```
新しく`centos6-7-yum-update`というboxが登録されていますね


### `centos6-7-yum-update`boxからCentOS起動まで
手順は
1.centos-6-7-yum-updateディレクトリを作成
2.`vagrant init`をキメる
3.vagrantfile編集
4.`vagrant up`で起動


1.ディレクトリ作成
※同じディレクトリ構成ではないと思うので各自の環境に合わせて変更してください
僕の場合カレントディレクトリは
`/d/various/vagrant/centos6-7`

`mkdir ../centos6-7-yum-update`
作ったディレクトリに移動
`cd ../centos6-7-yum-update`


2.vagrant init
centos6-7-yum-update用のvagrantfileを作成します

`vagrant init centos6-7-yum-update`

3.Vagrantfile編集
今回GUIモードは指定しません

```vagrantfile:vagrantfile
// Windowsから見ることの出来るIPを指定
config.vm.network "private_network", ip: "192.168.33.11"
```

4.vagrant upで起動
`vagrant up`

`sudo yum update`で特に更新されなければ大丈夫です

これで`centos6-7-yum-update`boxは作成完了


1つのbox作るだけでも長い……………………………………


##packageから作ったboxのVMにssh接続出来ない場合
`vagrant ssh`でログインして
`sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules`
ssh切って
`vagrant reload`

`ssh vagrant@192.168.33.10`でも入れるようになりました
参考
[macで作られたvagrant boxをもらったときに出るネットワークエラーの対処法](http://qiita.com/tarr1124/items/8276e609c0f7cdec79e7 "macで作られたvagrant boxをもらったときに出るネットワークエラーの対処法")
#docker-engineインストール状態のbox作成

手順は`centos6-7-yum-update`boxと大して変わりません、docker-engineインストールするくらいです
なのでdocker-engineのインストールだけ書きます

手順
1.`centos6-7-yum-update`にdocker-engineインストール
2.`vagrant package --output centos6-7-docker-engine`でbox作成
3.`vagrant box add centos6-7-docker-engine ./centos6-7-docker-engine`でbox登録
4.`vagrant init centos6-7-docker-engine`でvagrantfile生成
5.vagrantfile編集
6.vagrant upで実行


##docke-engineインストール
`curl -sSL https://get.docker.com/ | sh`
これ一発です笑
[Installation on CentOS](https://docs.docker.com/engine/installation/centos/ "Installation on CentOS")

dockerデーモン起動
`sudo service docker start`

```
[vagrant@localhost ~]$ sudo service docker start
Starting docker:                                           [  OK  ]
```

イメージ確認等のコマンド

```
[vagrant@localhost ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED
VIRTUAL SIZE
[vagrant@localhost ~]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED
STATUS              PORTS               NAMES
```

何もpullしていないのでimageは表示されませんが動くのは確認出来ました





#一旦終了
ひとまずdockerの入ったbox作成までを行い、`vagrant up`したらdockerが使える状態になっていれば問題ありません

いくつもVagrantfileを作ってディレクトリごとに`vagrant up`するのがvagrantの基本で良いのか疑っていますがdockerが動く状態にはなったのでここでひとまず


以上です :anchor: