Docker Machineを使ってDockerホストを立てる（VMware Fusion 7編）


# はじめに

[先日発表](http://blog.docker.com/2015/02/orchestrating-docker-with-machine-swarm-and-compose/)のあった、Docker 社公式のオーケストレーションツールである Docker Machine を使って、 VMware Fusion 7 へ Docker ホストを立ててみました。
Docker Machine と各環境向けドライバを組み合わせる事で、パブリッククラウドから手元のノートパソコンまで、統一的な操作で自動的に Docker ホストを構築する事が出来ます。

![osx_yosemite+docker+vmware_fusion_7.png](https://qiita-image-store.s3.amazonaws.com/0/10852/e8f90055-f5c5-244a-9ef9-8d618ab830e8.png)

- 本記事と合わせて下記も実施すると、手元のノートパソコンから遠隔サーバまでカバー出来るのが体感出来るかと思います。
    - [Docker Machineを使ってDockerホストを立てる（VMware ESXi 5.5 Update2編）](http://qiita.com/ysaotome/items/f2ba2aefa929a3033692) 


## 構築環境

- MacBook Pro (Retina, 13-inch, Late 2013)
    - OS  : Mac OS X Yosemite (10.10.2)
    - CPU : 2.8 GHz Intel Core i7
    - Mem : 16 GB 1600 MHz DDR3
- Docker (1.5.0)
- Docker Machine (v0.1.0)
- VMware Fusion 7 (Pro 7.1.1)

## 事前準備
- 対象環境に VMware Fusion 7 がセットアップ済みの状態としてください
- ```docker``` コマンドがセットアップ済みの状態としてください

```docker``` コマンドのインストールは ```brew``` が入っていれば簡単です

```zsh
% brew upgrade ; brew update ; brew install docker
Already up-to-date.
==> Downloading https://homebrew.bintray.com/bottles/docker-1.5.0.yosemite.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/docker-1.5.0.yosemite.bottle.tar.gz
==> Pouring docker-1.5.0.yosemite.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
?  /usr/local/Cellar/docker/1.5.0: 9 files, 7.2M
$
$ docker version
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.1
Git commit (client): a8a31ef
OS/Arch (client): darwin/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.17/version: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
```

# Docker Machine をセットアップ

## Docker Machine のダウンロードURLを確認
[GitHub の Docker Machine リポジトリ](https://github.com/docker/machine/releases) から最新版の Mac OS X用バイナリを確認

- 2015/03/08時点では下記が最新
    - https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_darwin-amd64

## Docker Machine をダウンロード

```zsh
$ sudo curl -L -o /usr/local/bin/docker-machine https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_darwin-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   401    0   401    0     0    374      0 --:--:--  0:00:01 --:--:--   374
100 15.5M  100 15.5M    0     0  1781k      0  0:00:08  0:00:08 --:--:-- 3926k
$ 
$ sudo chmod +x /usr/local/bin/docker-machine
$ docker-machine -v
docker-machine version 0.1.0
```

# Docker Machine を使ってみる

## Docker Machine を使って VMware Fusion 7 で boot2docker を起動

```docker-machine create``` で起動出来る
```--driver```  で VMware Fusion 7を指定するために ```vmwarefusion``` を選ぶ
マシン名は ```test-docker-host001``` とする

```zsh
$ docker-machine create --driver vmwarefusion test-docker-host001
INFO[0000] Creating CA: /Users/ysaotome/.docker/machine/certs/ca.pem
INFO[0000] Creating client certificate: /Users/ysaotome/.docker/machine/certs/cert.pem
INFO[0001] Downloading boot2docker.iso to /Users/ysaotome/.docker/machine/cache/boot2docker-vmw.iso...
INFO[0010] Creating SSH key...
INFO[0010] Creating VM...
INFO[0011] Waiting for VM to come online...
INFO[0036] "test-docker-host001" has been created and is now the active machine.
INFO[0036] To point your Docker client at it, run this in your shell: $(docker-machine env test-docker-host001)
```
初回なので、合わせて鍵生成とか行われた

確認

```zsh
% docker-machine ls
NAME               ACTIVE   DRIVER         STATE     URL                          SWARM
test-docker-host001   *        vmwarefusion   Running   tcp://192.168.112.138:2376
```
boot2dockerのホストが起動してる！

## コンテナの起動確認

該当ホスト上のコンテナ一覧を確認
docker コマンドの引数に ```$(docker-machine config test-docker-host001)``` を追加して、該当ホスト上に対してdockerコマンドを発行する

該当ホスト上のコンテナ一覧

```zsh
$ docker $(docker-machine config test-docker-host001) ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```
該当ホスト上では、1台もコンテナが起動していない

良くあるHello Worldをしてみる

```zsh
docker $(docker-machine config test-docker-host001) run busybox echo hello world
Unable to find image 'busybox:latest' locally
511136ea3c5a: Pull complete
df7546f9f060: Pull complete
ea13149945cb: Pull complete
4986bf8c1536: Pull complete
busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Status: Downloaded newer image for busybox:latest
hello world
```
ちゃんと表示された！

再度、該当ホスト上のコンテナ一覧を確認

```zsh
$ docker $(docker-machine config test-docker-host001) ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES
adb4e8f86121        busybox:latest      "echo hello world"   2 minutes ago       Exited (0) 2 minutes ago                       focused_davinci
```
ちゃんと残ってる

## 作成したホストへのログイン

sshでログインしてみる

```zsh
$ docker-machine ssh test-docker-host001
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.5.0, build vmw-1.5.0 : 67fcb7d - Wed Feb 18 10:00:58 UTC 2015
Docker version 1.5.0, build a8a31ef
docker@test-docker-host001:~$
```

鍵設定済みでノーパスワードログインが出来て便利！

直接コマンドの発行も出来る

```zsh
% docker-machine ssh test-docker-host001 'uname -a'
Linux test-docker-host001 3.18.5-tinycore64 #1 SMP Wed Feb 18 09:29:51 UTC 2015 x86_64 GNU/Linux
```

## ホストの停止と削除

作成したホストの停止

```zsh
$ docker-machine stop test-docker-host001
```

作成したホストの削除

```zsh
$ docker-machine rm test-docker-host001
```

確認

```zsh
$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM
```

# 気づいた事とか

かなり便利。
boot2docker の Mac OS X 版は VirtualBox 利用が標準になっていて、VMware Fusion で対応するのは多少面倒だったが一気に解消された。
個人的には、Vagrant + Fusionユーザーなので、VMware Fusion をバージョンアップする度に、お布施の様に [Supercharged Vagrant environments.](http://www.vagrantup.com/vmware) を購入してきたが、これで開放されそう。

引数のdriverを切り替える事で、様々な環境を統一的なコマンドで一元的に管理出来る破壊力を感じた。


## 起動時のオプション

[ドキュメント](https://docs.docker.com/machine/#vmware-fusion)によると設定項目は下記の通り
沢山コンテナを起動するのであれば、メモリやディスクは拡張したい所なので、オプションで簡単に設定出来るのは嬉しい。

| 環境変数 | CLI引数 | 意味 |
|:-----------|:------------|:------------|
| ```FUSION_BOOT2DOCKER_URL``` |```--vmwarefusion-boot2docker-url```|boot2dockerのイメージURL|
| ```FUSION_DISK_SIZE``` | ```--vmwarefusion-disk-size``` | boot2dockerで利用するディスクサイズ(デフォルト:```20000MB```) |
| ```FUSION_MEMORY_SIZE``` | ```--vmwarefusion-memory-size``` | boot2dockerで利用するメモリサイズ(デフォルト:```1024MB```) |

## 2ホスト同時に起動しようとするとエラーになる
```test-docker-host001``` を作成している状態で ```test-docker-host002``` を作成しようとするとエラー
v0.2.0で修正されそうな雰囲気

```zsh
% docker-machine create --driver vmwarefusion test-docker-host002
INFO[0000] Creating SSH key...
INFO[0000] Creating VM...
INFO[0001] Waiting for VM to come online...
ERRO[0025] Error creating machine: dial tcp 192.168.112.139:22: connection refused
WARN[0025] You will want to check the provider to make sure the machine and associated resources were properly removed.
FATA[0025] Error creating machine
```

----
- 参考
    - [Docker Machine Repository @github](https://github.com/docker/machine/)
    - [Docker Machine User Guide @docker ](https://docs.docker.com/machine/)