Docker Machineを使ってDockerホストを立てる（VMware ESXi 5.5 Update2編）


# はじめに

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

![osx_yosemite+docker+vmware_vsphere_5.5.png](https://qiita-image-store.s3.amazonaws.com/0/10852/5f6751e2-5b94-d4af-d6d6-845662128df2.png)

- 本記事と合わせて下記も実施すると、手元のノートパソコンから遠隔サーバまでカバー出来るのが体感出来るかと思います。
    - [Docker Machineを使ってDockerホストを立てる（VMware Fusion 7編）](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)
- govc (@c848630)
- VMware ESXi (5.5 Update2)

## 事前準備
- ネットワークアクセス可能な場所に VMware ESXi 5.5 Update 2 がセットアップ済みの状態としてください
    - VMware ESXi 5.5 Update 2 のセットアップ方法が不明な方は下記記事を参考にください
        - [VMware Fusion 7 Pro を使って VMware ESXi 5.5 Update2 のテスト環境を構築する（Nested ESXi）](http://qiita.com/ysaotome/items/00bacd38cae8e250fed5)

- ```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?
```

- ```govc``` コマンドがセットアップ済みの状態としてください
    - ```govc``` コマンドのインストールは多少面倒ですが、 ```brew``` を活用しましょう

```govc``` を動かすために、まずは ```go``` をインストールします。

```zsh
$ brew upgrade ; brew update ; brew install go
Updated Homebrew from 336017cd to 66ca49fd.
==> Updated Formulae
boot2docker	    docker		gecode		    google-app-engine	passenger
cabal-install	    ffmpeg		go-app-engine-32    mapnik		solr
cppcheck	    fossil		go-app-engine-64    mesos		syncthing
==> Downloading https://homebrew.bintray.com/bottles/go-1.4.2.yosemite.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring go-1.4.2.yosemite.bottle.1.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
?  /usr/local/Cellar/go/1.4.2: 4566 files, 155M
$
$ go version
go version go1.4.2 darwin/amd64
$
$ export GOPATH=$HOME/src/go
$ mkdir -p $GOPATH
$ export PATH=$PATH:$GOPATH/bin
```

```govc``` をインストール
[ドキュメント](https://docs.docker.com/machine/#vmware-vsphere)によると、テスト済みなのはビルド番号 ```c848630``` との事だが、とりあず最新版をインストール

```zsh
$ go install github.com/vmware/govmomi/govc
% govc version
govc version 0.0.1-dev
```

# Dokcer 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

## Dokcer 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 ESXi 5.5 Update 2 で boot2docker を起動

```docker-machine create``` で起動出来る
マシン名は ```test-docker-host002``` とする
引数は下記の通りとした
```--driver``` : ```vmwarevsphere``` VMware ESXi 5.5 Update 2 を指定
```--vmwarevsphere-vcenter``` : ```192.168.112.140``` 今回は ESXi ホストへ直接アクセスするのでIPアドレスを直接指定
```--vmwarevsphere-username``` : ```root``` ESXi ホストのログインユーザー名
```--vmwarevsphere-password``` : ```hogehoge``` ESXi ホストのパスワード
```--vmwarevsphere-network``` : ```'VM Network'``` boot2docker仮想マシンの接続先ネットワークラベル名
```--vmwarevsphere-datastore``` : ```'datastore1'``` boot2docker仮想マシンの配置先データストア名
```--vmwarevsphere-datacenter``` : ```ha-datacenter``` ESXi ホストへ直接アクセスする際は ```ha-datacenter``` で固定

いざ起動！

```zsh
$ docker-machine create --driver vmwarevsphere --vmwarevsphere-vcenter 192.168.112.140 --vmwarevsphere-username root --vmwarevsphere-password hogehoge --vmwarevsphere-network 'VM Network' --vmwarevsphere-datastore 'datastore1' --vmwarevsphere-datacenter ha-datacenter test-docker-host002
INFO[0000] Generating SSH Keypair...
INFO[0000] Uploading Boot2docker ISO ...
INFO[0000] Creating directory boot2docker-iso on datastore datastore1 of vCenter 192.168.112.140...
INFO[0000] Uploading /Users/ysaotome/.docker/machine/cache/boot2docker-vmw.iso to boot2docker-iso on datastore datastore1 of vCenter 192.168.112.140...
INFO[0000] Creating virtual machine test-docker-host002 of vCenter 192.168.112.140...
INFO[0000] Configuring the virtual machine test-docker-host002...
INFO[0000] Powering on virtual machine test-docker-host002 of vCenter 192.168.112.140...
INFO[0039] Configuring virtual machine test-docker-host002...
INFO[0042] "test-docker-host002" has been created and is now the active machine.
INFO[0042] To point your Docker client at it, run this in your shell: $(docker-machine env test-docker-host002)
```
初回なので、合わせて鍵生成とかboot2dockerイメージのESXiホストへのアップロードとか行われた。

確認

```zsh
% docker-machine ls
NAME                  ACTIVE   DRIVER          STATE     URL                          SWARM
test-docker-host001   *        vmwarefusion    Stopped   tcp://192.168.112.138:2376
test-docker-host002            vmwarevsphere   Running   tcp://192.168.112.143:2376
```
boot2dockerのイメージが ESXi ホストで起動してるヨ！
ちなみに ```test-docker-host001``` は、手元の VMware Fusion 7 で起動しているホスト

## コンテナの起動確認

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

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

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

良くあるHello Worldをしてみる

```zsh
docker $(docker-machine config test-docker-host002) 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-host002) ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                      PORTS               NAMES
7fe7e348540c        busybox:latest      "echo hello world"   18 seconds ago      Exited (0) 17 seconds ago                       loving_franklin
```
ちゃんと残ってる

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

sshでログインしてみる

```zsh
$ docker-machine ssh test-docker-host002
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ 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-host002:~$
```

鍵設定済みでノーパスワードログインが出来ますね。
やっぱりこれは便利だーーーー！

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

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

## ホストの停止と削除

作成したホストの停止

```zsh
$ docker-machine stop test-docker-host002
INFO[0000] Powering off virtual machine test-docker-host002 of vCenter 192.168.112.140...
```

作成したホストの削除

```zsh
$ docker-machine rm test-docker-host002
INFO[0000] Deleting virtual machine test-docker-host002 of vCenter 192.168.112.140...
```

確認

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

# 気づいた事とか

かなり便利。
VMware Fusion 7 と VMware ESXi 5.5 Update2 の間で殆ど差を感じる事無くDockerホストのデプロイが出来る。
コンテナイメージもレジストリ登録してあれば、どちらにでも展開出来るし、これは未來があると思う。
vCenter Serverが存在する環境でも試してみたいと思った。

## 起動時のオプション

[ドキュメント](https://docs.docker.com/machine/#vmware-vsphere)によると設定項目は下記の通り
boot2dockerイメージをデプロイする時に使いたい様な設定はひと通り設定出来る感じ。

| 環境変数 | CLI引数 | 意味 |
|:-----------|:------------|:------------|
|```VSPHERE_USERNAME```| ```--vmwarevsphere-username```|vSphere/ESXi のユーザー名|
|```VSPHERE_PASSWORD```| ```--vmwarevsphere-password```|vSphere/ESXi のパスワード|
|```VSPHERE_BOOT2DOCKER_URL```| ```--vmwarevsphere-boot2docker-url```|boot2dockerのイメージURL|
|```VSPHERE_COMPUTE_IP```| ```--vmwarevsphere-compute-ip```|接続先ESXiホストのIPアドレス|
|```VSPHERE_CPU_COUNT```| ```--vmwarevsphere-cpu-count```|boot2dockerで利用するCPU数(デフォルト:```2```)|
|```VSPHERE_DATACENTER```| ```--vmwarevsphere-datacenter```|boot2dockerを配置するデータセンター名(vCenterServerが存在しない場合は ```ha-datacenter``` と入力)|
|```VSPHERE_DATASTORE```| ```--vmwarevsphere-datastore```|boot2dockerで利用するデータストア名|
|```VSPHERE_DISK_SIZE```| ```--vmwarevsphere-disk-size```|boot2dockerで利用するディスクサイズ(デフォルト:```20000MB```)|
|```VSPHERE_MEMORY_SIZE```| ```--vmwarevsphere-memory-size```|boot2dockerで利用するメモリサイズ(デフォルト:```2048MB```)| 
|```VSPHERE_NETWORK```| ```--vmwarevsphere-network```|boot2dockerで利用するネットワークラベル名|
|```VSPHERE_POOL```| ```--vmwarevsphere-pool```|boot2dockerで利用を配置するリソースプール名|
|```VSPHERE_VCENTER```| ```--vmwarevsphere-vcenter```|接続先vCenterServerのIPアドレス(ESXi直接の場合は不要)|

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

```zsh
% docker-machine create --driver vmwarevsphere --vmwarevsphere-vcenter 192.168.112.140 --vmwarevsphere-username root --vmwarevsphere-password hogehoge --vmwarevsphere-network 'VM Network' --vmwarevsphere-datastore 'datastore1' --vmwarevsphere-datacenter ha-datacenter test-docker-host003
INFO[0000] Generating SSH Keypair...
INFO[0000] Uploading Boot2docker ISO ...
INFO[0000] boot2docker ISO already uploaded, skipping upload...
INFO[0000] Creating virtual machine test-docker-host003 of vCenter 192.168.112.140...
INFO[0000] Configuring the virtual machine test-docker-host003...
INFO[0001] Powering on virtual machine test-docker-host003 of vCenter 192.168.112.140...
INFO[0040] Configuring virtual machine test-docker-host003...
sh: can't kill pid 1314: No such process
ERRO[0042] Error creating machine: exit status 1
WARN[0042] You will want to check the provider to make sure the machine and associated resources were properly removed.
FATA[0042] Error creating machine
```

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