Azure仮想マシンにdockerをセットアップ

# はじめに

__Microsoft Azure__の仮想マシンに__docker__の実行環境をセットアップする手順を説明します。

普通にAzureの管理ポータルからLinux仮想マシンを作成してdockerをセットアップしていくこともできますが、
今回はAzureのコマンドラインインターフェースである [Xplat-CLI](http://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli/)を使います。

Xplat-CLIでは

 1. 仮想マシンの作成

 1. 仮想マシン上にdockerをセットアップ

 1. 仮想マシンのエンドポイント設定（dockerポートの開放）

 1. リモート接続用の証明書のセットアップ

までの処理をコマンド一発で実行することができ、簡単にAzure上のdocker環境を手に入れられます。

# 事前準備

Microsoft Azureを利用するため、以下の２つを取得しておきます。

* [Microsoftアカウント](http://www.microsoft.com/ja-jp/msaccount/default.aspx)
* Azureのサブスクリプション ([無償評価版](http://azure.microsoft.com/ja-jp/offers/ms-azr-0044p/)もあります）

## クライアント環境 ( CentOS7 )

クライアント環境には、__xplat-cli__ および __docker__ をインストールします。

### 1. xplat-cli

xplat-cli は node.js で動作するため、まず node.js から導入します。
CentOS 7 では, epel に node.js が入っています。

#### yum で epel を追加

```
# yum install epel-release
```

#### yum で nodejs, npm をインストール

```
# yum install nodejs npm
```

#### npm で azure-cli をインストール

```
# npm install -g azure-cli
```

これで```azure```コマンドが使えるようになります

```
# azure -v
0.8.10
```

Azureサブスクリプションに接続するために、発行設定ファイル(.publishsettingsファイル)をダウンロードします。

```
$ azure account download
info:    Executing command account download
info:    Launching browser to http://go.microsoft.com/fwlink/?LinkId=*****
help:    Save the downloaded file, then execute the command
help:      account import <file>
info:    account download command OK
```

表示されたリンクにブラウザでアクセスすると、発行設定ファイルをダウンロードできます。

次にダウンロードした発行設定ファイルをインポートします。

```
$ azure account import path_to_*******-credentials.publishsettings 
info:    Executing command account import
info:    account import command OK
$ 
```

以下のコマンドでサブスクリプションが表示されれば準備OKです。

```
$ azure account list
info:    Executing command account list
data:    Name                 Id                                    Current
data:    -------------------  ------------------------------------  -------
data:    *******************  ************************************  true   
info:    account list command OK
$ 
```

### 2. docker（クライアント）

今回は Azure上にdocker環境を作るのが目的なので、本来クライアント環境にdockerは不要ですが、クライアント上にもdockerコマンドがあると、Azure上のdockerをリモートで操作できて便利なので導入しておきます。

#### yum で docker をインストール

CentOS7からはデフォルトでExtrasリポジトリにdockerが含まれています。

```
# yum install docker
# docker -v
Docker version 0.11.1-dev, build 02d20af/0.11.1
```

# Azure上にDocker導入済み仮想マシンを作成

ここからはいよいよ Azure 上に Docker環境を作成していきます。
とはいえ、実行するコマンドはただ一つ ```azure vm docker create```だけです。
以下のように様々なオプションが指定できます。

```
$ azure help vm docker create
info:    Executing command help
help:    Create a VM
help:    
help:    Usage: vm docker create [options] <dns-name> <image> <user-name> [password]
help:    
help:    Options:
help:      -h, --help                             output usage information
help:      -v, --verbose                          use verbose output
help:      --json                                 use json output
help:      -p, --docker-port [port]               Port to use for docker [4243]
help:      -C, --docker-cert-dir [dir]            Directory containing docker certs [.docker/]
help:      -c, --connect                          connect to existing VMs
help:      -l, --location <name>                  the location
help:      -a, --affinity-group <name>            the affinity group
help:      -u, --blob-url <url>                   the blob url for OS disk
help:      -z, --vm-size <size>                   the virtual machine size [small]
help:          extrasmall, small, medium, large, extralarge, a5, a6, a7, a8, a9
help:      -n, --vm-name <name>                   the virtual machine name
help:      -e, --ssh [port]                       the ssh port to enable [22]
help:      -t, --ssh-cert <pem-file|fingerprint>  the SSH certificate
help:      -P, --no-ssh-password                  indicates that the password should be removed when using --ssh-cert
help:      -w, --virtual-network-name <name>      the virtual network name
help:      -b, --subnet-names <list>              the comma-delimited subnet names
help:      -S, --static-ip <ip-address>           the static IP address assigned to the virtual machine
help:      -R, --reserved-ip <name>               the name of the reserved IP address assigned to the virtual machine
help:      -A, --availability-set <name>          the name of availability set to create or use
help:      -s, --subscription <id>                the subscription id
help:      -d, --custom-data <custom-data-file>   CustomData file
$ 
```

最低限、決定しておくべき項目は以下の６つです。

| 設定項目 | 指定値 | |
|:-----------|------------|------:|
|FQDN|{hostname}.cloudapp.net|適当に被らなそうなホスト名をつけます|
|ロケーション| Japan East|近くのDCを選びます|
|VMサイズ| ExtraSmall|テストなので一番小さいので|
|OS|Ubuntu 14.04 LTS 64bit|dockerをサポートするOSを選びます|
|VMイメージ |b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64-server-20140724-en-us-30GB|VMイメージ名は azure vm image list で調べておきます|
|アカウント|azureuser|VMのログインアカウント|

#### 仮想マシン作成

上で決定した設定値を元に ```azure vm docker create``` を実行します。

```
$ azure vm docker create ¥
   {hostname} ¥
   --location "Japan East" ¥
   --vm-size ExtraSmall ¥
   b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04-LTS-amd64-server-20140724-en-us-30GB ¥
   azureuser
```

これだけで、約5分後にはDockerセットアップ済みの仮想マシンがデプロイされ、アクセス可能な状態になります。
ちなみに、dockerに接続するための証明書やエンドポイントは自動的に設定されます。

#### 証明書

クライアントのホームの```.docker```ディレクトリに証明書や鍵が格納されます。

```
$ ls ~/.docker
ca-key.pem  ca.pem  cert.pem  client.csr  extfile.cnf  key.pem  server-cert.pem  server-key.pem  server.csr
$ 
```

#### エンドポイント

仮想マシンのエンドポイントには自動的にdockerの使用ポートである __4243/tcp__ が設定されます。

![仮想マシン_-_Windows_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/54171/2ff3432f-63c5-44db-5b28-2f7d69160445.png)


## テスト接続

dockerコマンドでAzure上のdockerに接続してみます。
暗号化通信のため必ず```--tls```を忘れずに、```-H=tcp://```で仮想マシンのFQDN:4243を指定します。

```
$ docker --tls -H=tcp://{hostname}.cloudapp.net:4243 version
Client version: 0.11.1-dev
Client API version: 1.12
Go version (client): go1.2
Git commit (client): 02d20af/0.11.1
Server version: 1.3.0
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): c78088f
$ 
```

あとは通常のdockerと使い方は同じです。

```
$ docker --tls -H=tcp://{hostname}:4243 pull centos:latest
centos:latest: The image you are pulling has been verified
511136ea3c5a: Pull complete 
5b12ef8fd570: Pull complete 
87e5b6b3ccc1: Pull complete 
Status: Downloaded newer image for centos:latest
$
$ docker --tls -H=tcp://{hostname}.cloudapp.net:4243 images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              87e5b6b3ccc1        2 weeks ago         224 B
$
$ docker --tls -H=tcp://{hostname}.cloudapp.net:4243 run -it centos /bin/bash
bash-4.2# cat /etc/redhat-release 
CentOS Linux release 7.0.1406 (Core) 
bash-4.2# uname -a
Linux 9c86914f674c 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
bash-4.2# 
```

__Enjoy your docker life !__

# おわりに

このところMicrosoftとDockerの動きが活発化してきています。

2014/10/15の両社の[発表](https://blog.docker.com/2014/10/docker-microsoft-partner-distributed-applications/)によると、__Docker Engine for Windows Server__を開発中で、次期Windowsサーバでは、Windowsのコンテナ仮想化が可能になるとのことです。
DockerによってLinuxでは当たり前になりつつあるコンテナ技術ですが、Windowsでも使えるとなれば一気に裾野が広がりそうでますます目が離せませんね。