Atlas + Packer + Docker + Vagrantで複数コンテナをのせたVMを作成する

Atlas + Packer + Docker + Vagrantで複数コンテナをのせたVMを作成します

## <i class="fa fa-file-text" style="font-size:1em;"></i> 仕様
* PackerでDockerコンテナを2個(コンテナA/Bとする)作成する
* Atlas+PackerでUbuntu(+Docker)+コンテナA/B構成のVagrant Boxを作成する
* Atlasに作成したBoxをダウンロードしてVagrantでVMを作成する
* VagrantでVMを起動し、cowsayとfigletを呼び出す

## <i class="fa fa-flag-checkered" style="font-size:1em;"></i> 目的
この検証の目的は複数コンテナで構成される開発環境をAtlasとVagrantで管理することです。
これにより、環境構築の担当者がPackerでコンテナとBoxを作成し、
開発者はVagrant upをするだけで最新の環境をいつでもゼロから作成できるようにし、
開発者間の環境の差異をなくすことです。

## <i class="fa fa-image" style="font-size:1em;"></i> 図解
![multi_containers_vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/43480/db55099d-e6c8-0027-fbc2-1953bcb36285.png)

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 前提
* 各種ツールをインストール済み
* Docker Hubのアカウントを取得済み

## <i class="fa fa-files-o" style="font-size:1em;"></i> 手順
### <i class="fa fa-dropbox" style="font-size:1em;"></i> 1. PackerでDockerコンテナを2個作成
cowsayとfigletをインストールしたUbuntuのコンテナをそれぞれ作成します。
作成手順は下記を参照

<i class="fa fa-external-link" style="font-size:1em;"></i> [Packer buildでDocker HubにDocker Imageを保存するやいなやpullしてcowsayする - Qiita](http://qiita.com/tbpgr/items/4c4099bd21bfc24003e8)

#### cowsayコンテナ疎通確認

```bash
$ docker pull tbpgr/cowsay:0.0.1
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
tbpgr/cowsay       0.0.1               4cf3f5bac14b        2 minutes ago       210.5 MB
$ docker run tbpgr/cowsay:0.0.1 /usr/games/cowsay hoge
 ______
< hoge >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```

#### figletコンテナ疎通確認

```bash
$ docker pull tbpgr/figlet:0.0.1
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
tbpgr/figlet       0.0.1               4cf3f5bac14b        2 minutes ago       210.5 MB
$ docker run tbpgr/figlet:0.0.1 /usr/bin/figlet hoge
 _                      
| |__   ___   __ _  ___ 
| '_ \ / _ \ / _` |/ _ \
| | | | (_) | (_| |  __/
|_| |_|\___/ \__, |\___|
             |___/      
```

### <i class="fa fa-cube" style="font-size:1em;"></i> 2. Atlas+PackerでUbuntu(docker)+コンテナA/B構成のVagrant Boxを作成する
[shiguredo/packer-templates のubuntu14.0](https://github.com/shiguredo/packer-templates/tree/develop/ubuntu-14.04) をベースにさせていただきます。
また、docker.shを [ubuntu-12.04-docker/scripts/docker.sh](https://github.com/shiguredo/packer-templates/blob/develop/ubuntu-12.04-docker/scripts/docker.sh) から取得して追加します。

#### cowsayコンテナとfigletコンテナの設定を追加する
複数コンテナの管理にはdocker-composeを利用します。
docker-composeについては
<i class="fa fa-external-link" style="font-size:1em;"></i> [docker-composeで複数のコンテナをyamlファイルで管理し、最後にcowsayする - Qiita](http://qiita.com/tbpgr/items/7f7de0b8e518453df482) を参照。

```bash:./script/dockerimages.sh
sudo apt-get install curl -y
curl -L https://github.com/docker/compose/releases/download/1.3.2/docker-compose-`uname -s`-`uname -m` > docker-compose
sudo cp docker-compose /usr/local/bin/
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v
cat <<EOS> docker-compose.yml
cowsay:
  image: tbpgr/cowsay:0.0.1
  command: /usr/games/cowsay hoge
figlet:
  image: tbpgr/figlet:0.0.1
  command: /usr/bin/figlet hoge
EOS
docker-compose run cowsay
docker-compose run figlet
```

#### template.json のpost-processors

```json:template.json
  "post-processors": [
      [{
          "type": "vagrant",
          "keep_input_artifact": false
      },
      {
          "type": "atlas",
          "only": ["virtualbox-iso"],
          "artifact": "tbpgr/multi",
          "artifact_type": "vagrant.box",
          "metadata": {
              "provider": "virtualbox",
              "version": "0.0.1"
          }
      }]
  ]
```

* 実行

```bash
$ packer push -name tbpgr/multi template.json 
```

* AtlasのGUIで完成した tbpgr/multi Boxを確認
![atlas_vagrant_box.png](https://qiita-image-store.s3.amazonaws.com/0/43480/72b0a710-21a9-9ede-1ad2-a9d738ef14b7.png)

### <i class="fa fa-desktop" style="font-size:1em;"></i> 3. Atlas上のBoxでVagrantを利用してVMを作成する
#### 1. Vagrantfileの初期化
```bash
$ vagrant init tbpgr/multi -m
```

#### 2. Vagrantfileの編集
```ruby:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.provider :virtualbox do |vb|
    vb.name = "multi"
  end

  config.vm.network :private_network, ip: "172.16.33.124"
  config.vm.box = "tbpgr/multi"
end
```

### <i class="fa fa-child" style="font-size:1em;"></i> 4. VagrantでVMを起動し、cowsayとfigletをする
```bash
$ vagrant up --provider virtualbox
$ vagrant ssh
vagrant@ubuntu-1404:~$ docker ps

vagrant@ubuntu-1404:~$ sudo docker-compose run cowsay
 ______
< hoge >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
vagrant@ubuntu-1404:~$ sudo docker-compose run figlet
 _
| |__   ___   __ _  ___
| '_ \ / _ \ / _` |/ _ \
| | | | (_) | (_| |  __/
|_| |_|\___/ \__, |\___|
             |___/
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Packer buildでDocker HubにDocker Imageを保存するやいなやpullしてcowsayする - Qiita](http://qiita.com/tbpgr/items/4c4099bd21bfc24003e8)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [packer-templates - shigeuredo - GitHub](https://github.com/shiguredo/packer-templates)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Ubuntu14.04 Trusty](http://releases.ubuntu.com/trusty/)