Docker Machine で AWS/Azure 上に Docker ホストを作成する

# はじめに
Docker Machine で AWS と Microsoft Azure 上に Docker ホストを作成する手順をまとめておきます。

## Docker Machine とは？
ローカルマシン上やクラウド上に Docker のホストを作成するツールです。
Docker ホストの作成以外に、ホストの停止・開始、Docker のアップグレードなどができます。

## 環境
今回の検証環境は以下です。

![DockerMachine.png](https://qiita-image-store.s3.amazonaws.com/0/79316/9dc4543b-7e83-f38e-4116-9220d7415c96.png)

# Docker Machine のインストール
ローカルのPCに Docker Machine をインストールします。

```bash:LocalPC
$ wget https://github.com/docker/machine/releases/download/v0.5.0/docker-machine_linux-amd64.zip
$ unzip docker-machine_linux-amd64.zip
$ rm docker-machine_linux-amd64.zip
$ sudo mv docker-machine* /usr/local/bin/
```

# Docker ホストの作成

## AWS に作成する場合

以下のコマンドを実行すると Docker Engine がインストールされた EC2 インスタンスが作成されます。

```bash:LocalPC
$ docker-machine create	\
   --driver amazonec2   \
   --amazonec2-access-key AKIXXXXX   \
   --amazonec2-secret-key XXXXX   \
   --amazonec2-vpc-id vpc-XXXXXXXX   \
   --amazonec2-subnet-id subnet-XXXXXXXX   \
   --amazonec2-region ap-northeast-1   \
   --amazonec2-instance-type t2.micro  \
   docker-aws01
```

## Microsoft Azure に作成する場合

まず、Azure へ API を発行するための証明書を作成します。

```bash:LocalPC
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout azure.pem -out azure.pem
openssl pkcs12 -export -out azure.pfx -in azure.pem -name "My Azure Cert"
openssl x509 -inform pem -in azure.pem -outform der -out azure.cer
```

そして、作成した証明書(ここでは azure.cer) を Azure のポータルサイトからインポートします。

ここまで準備が出来たら、Docker ホストを作成します。

```bash:LocalPC
$ docker-machine create -d azure \
 --azure-subscription-id="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" \
 --azure-subscription-cert="azure.pem" \
 --azure-location "Japan East" \
 docker-azure01
```

コマンドの最後に指定する名前(上記の docker-azure01)は、Azure 上のクラウドサービス名としても使われるため、Azure 全体でユニークな名前である必要があります。

## 作成したホストの確認
次のコマンドで、作成した Docker ホストの一覧を確認できます。

```bash:LocalPC
$ docker-machine ls
NAME             ACTIVE   DRIVER      STATE     URL                                      SWARM
docker-aws01     *        amazonec2   Running   tcp://54.250.148.168:2376
docker-azure01   -        azure       Running   tcp://docker-azure01.cloudapp.net:2376
```

# Docker Machine のコマンド

Docker Machine  は基本的に Docker ホストを操作するためのツールですが、リモートから Docker Engine を制御しやすくしたり、Docker ホストに SSH 接続する機能もあります。

## コンテナの作成
例えばローカルPCから、AWS の Docker ホスト上でコンテナを起動させるには次のようにします。

```bash:LocalPC
# リモートの Docker Engine の情報を環境変数にセット
$ eval docker-machine env docker-aws01
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://54.250.148.168:2376"
export DOCKER_CERT_PATH="/home/ubuntu/.docker/machine/machines/docker-aws01"
export DOCKER_MACHINE_NAME="docker-aws01"

# ローカルの Docker コマンドから、リモート(この場合は AWS)の Docker エンジンを操作
$ docker run -itd --name aws busybox

$ docker ps
CONTAINER ID   IMAGE      COMMAND   CREATED           STATUS         PORTS   NAMES
39bd49c3fb49   busybox    "sh"      4 seconds ago     Up 3 seconds           aws
```

同じことを以下のように実行することもできます。

```bash:LocalPC
$ docker $(docker-machine config docker-azure01) run -itd --name azure busybox

$ docker $(docker-machine config docker-azure01) ps
CONTAINER ID   IMAGE      COMMAND   CREATED           STATUS         PORTS   NAMES
dab1a0bad67f   busybox    "sh"      6 seconds ago     Up 5 seconds           azure
```

## SSH での接続
Docker Machine から、作成した Docker ホストに SSH 接続できます。

```bash:LocalPC
$ docker-machine ssh docker-aws01
```

# 参考サイト
[Docker Machine](https://docs.docker.com/machine/)
[Azure で docker マシンを使用する方法](https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-docker-machine/)
[Docker Machine リファレンス](http://qiita.com/spesnova/items/073dd64a8a1d580d9ae9)