ConoHaでDocker Machineを使う

Docker MachineはDockerホストをローカルコンピュータやクラウドプロバイダー上に手軽に構築するためのツールです。普通に仮想マシンを立ててaptなりyumなりでDockerをインストールしても良いのですが、Docker Machineを使うと、インスタンスの作成、破棄や環境変数の設定などを簡単に行えるのがメリットです。Vagrantみたいな感じですね。

[Docker Machine](https://www.docker.com/docker-machine)

Docker Machineにはプラットフォームに対応しています。ドライバも多いです。

https://github.com/docker/machine/tree/master/drivers

OpenStackドライバがあるので、これを[ConoHa](https://www.conoha.jp/)で動かしてみましたが、インスタンスのIP取得部分で問題があったので、修正版を作ってみました。これでConoHaでDocker遊びがしやすくなりますね！

~~[修正版 hironobu-s/machine](https://github.com/hironobu-s/machine)~~

## 修正点

ConoHaはIPv4、IPv6のデュアルスタック環境なのですが、Docker MachineのOpenStackドライバはこれを考慮せず、インスタンスに対してIPv6で接続しようとします。

修正版は--openstack-ip-versionと言うオプションが追加されていて、IPバージョンを選択できるようになっています。また、指定が無い場合はIPv4アドレスを優先して使うようになっています。

~~本家にPRを送ってあるので、いずれマージしてもらえると思います。~~
~~https://github.com/docker/machine/pull/1933~~

~~マージしてもらえました。次のリリースで入ると思います。~~
~~レビューしてくれたのはVagrantのOpenStackドライバーを書いてる方だった。~~

Version 0.5.0のリリースで取り込んでもらえました。

## インストール

オフィシャルの通りにインストールして下さい
https://docs.docker.com/machine/

## マシンの作成

### 認証情報の設定

ConoHaのAPIを使うための認証情報を環境変数に設定します。シェルから以下のコマンドを実行します。認証情報はConoHaコントロールパネルのAPIページにあります。

```bash
export OS_USERNAME=[APIユーザー名]
export OS_TENANT_ID=[APIテナントID]
export OS_PASSWORD=[APIパスワード]
export OS_AUTH_URL=https://identity.tyo1.conoha.io/v2.0
export OS_REGION_NAME=tyo1
```

### Dockerホストを作成する

次にホストを作成します。OpenStackドライバには多くのオプションがありますが、とりあえずマシンを立てるなら以下のようにすればOKです。

```bash
docker-machine create \
  -d openstack \
  --openstack-flavor-name g-1gb \
  --openstack-image-name vmi-ubuntu-14.04-amd64 \
  --openstack-sec-groups "default,gncs-ipv4-all" \
  test-docker-host
Creating machine...
To see how to connect Docker to this machine, run: docker-machine env test-docker-host
```

-d はドライバ名
--openstack-flavor-name はConoHaの場合はプラン名
--openstack-image-name はOSイメージ
をそれぞれ指定します。指定できる値は下記です。

[flavor-list](https://gist.github.com/hironobu-s/5fa28fe3910f0b5fd360)
[image-list](https://gist.github.com/hironobu-s/4bba043fcc2b5df7bf8f)

このオプションでは、ConoHaの1GBプランにUbuntu14.04ベースのDockerホストが作成されます。裏側では、インスタンスの作成、インスタンスの起動待ち、apt-get update、dockerのインストール、が自動で行われるので少し時間がかかります。

そして、コントロールパネルを見ると、新しいインスタンスが作成されています。

![docker-machin1.png](https://qiita-image-store.s3.amazonaws.com/0/44152/2fc67e78-c486-820a-4e25-3d74b8527410.png)

## Dockerホストを使う

docker-machineのenvサブコマンドを使うと、作成したホストを使うための環境変数が表示されます。

```bash
$ docker-machine env test-docker-host
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://133.130.***.***:2376"
export DOCKER_CERT_PATH="/home/hiro/.docker/machine/machines/test-docker-host"
export DOCKER_MACHINE_NAME="test-docker-host"
# Run this command to configure your shell:
# eval "$(docker-machine env test-docker-host)"
```

コメントにあるとおり、最終行を実行すると環境変数がセットされます。

```bash
$ eval "$(docker-machine env test-docker-host)"
```

docker infoコマンドでホストの情報を見てみましょう。

```bash
$ docker info
Containers: 0
Images: 0
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.16.0-36-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 2
Total Memory: 993.7 MiB
Name: test-docker-host
ID: 3OBJ:56EY:OMEI:E5IR:HH2V:35D7:JSQW:6MWA:PSV4:MXYV:E65F:TUMD
WARNING: No swap limit support
Labels:
 provider=openstack
```

ConoHa上に作成されたホストの情報が表示されました。「provider=openstack」になっていますね！ このあとはいつも通りdockerコマンドを使ってpullしたりrunしたりすればOKです。

## Dockerホストの管理

docker-machineにはインスタンスを管理するコマンドがあります。いくつか紹介します。


### start, stop, rm

それぞれ仮想マシンの起動、停止、削除です。この辺は基本ですね。

```bash
docker-machine start test-docker-host
Starting OpenStack instance...           MachineId=6c294adf-8ab1-4042-8341-ae06a0771a38
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
```

```bash
docker-machine stop test-docker-host
Stopping OpenStack instance...           MachineId=6c294adf-8ab1-4042-8341-ae06a0771a38
```


### ssh, scp
dockerホストに直接SSHで接続したり、SCPで直接ファイルコピーできます。

```
$ docker-machine ssh test-docker-host
```

### ls 

マシンの一覧を表示します。今回は1つのホストを作成しましたが、docker-machineは名前を変えれば多くのホストを作成できます。

```bash
$ docker-machine ls test-docker-host
NAME               ACTIVE   DRIVER      STATE     URL                          SWARM
test-docker-host   *        openstack   Running   tcp://133.130.***.***:2376
```

### upgrade

ホスト上のDockerのバージョンを更新します。これローカルからできるの便利ですわ。

```bash
$ docker-machine upgrade test-docker-host
```


## おわりに

Docker Machineの特徴は、環境を問わずDockerホストを作成できる点です。ConoHaは値段的に個人でも手頃に使えるので、Docker遊びするにはちょうど良いのではないでしょうか。