AzureでDockerしよう（準備編）

Webサービスといえば今やクラウドが当たり前ですが、フレキシブルにスケールアウトさせたり、ステージング環境からプロダクション環境を構成したりと、Dockerの出番はあちこちにあります。ChefやVagrantでDevOpsを実現する方法が流行っていましたが、これからDocker全盛の時代になっていくでしょう。

DockerはLinuxでしか使えませんが、Windows向きと思われているAzureでもしっかりDocker対応はされています。ただ、まとまった情報や、分かりやすくスタートできそうな手順がなかったので、書き上げておくことにしました。


何はともあれ、まずはVMが必要ですから、LinuxのVMを立てます。

# VMの立ち上げ

AzureでVMを立ち上げるのは簡単。Azureポータルからウイザードに従って設定するだけ。
1. [Azureポータル](https://manage.windowsazure.com/)にログインしてVMを作成。
2. VMイメージをギャラリーから選ぶ。現時点でDockerに対応されているのは「Linux（Ubuntu 14.04）」イメージ。

# 証明書を作成する
Dockerをコントロールするのに、サーバ証明書とクライアント証明書が必要になるので、VMが立ち上がったらSSHでログインし、以下の手順で証明書を作成する。
（参考）http://docs.docker.com/articles/https/

OpenSSLのコマンドを使って証明書ファイルを作って行きます。

```bash
$ openssl genrsa -aes256 -out ca-key.pem 4096
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
$ openssl genrsa -out server-key.pem 4096
```

ホスト名を環境変数にセット（Azure では環境変数`$HOST`が空のため）します。
※ ここでわざわざ環境変数にセットしなくても良いんですが、今後このスクリプトを自動化するかも知れないので、念のため。

```bash
$ export HOST=docker01-ict.cloudapp.net
```

ローカルから接続することを考えて、ローカルIPからも接続できるように設定します。（ホスト名がDNSで引けないIPアドレスから接続する場合、IPを指定してやる必要があります。）

```bash
$ echo subjectAltName = IP:127.0.0.1 > extfile.cnf
```

```bash
$ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
$ openssl genrsa -out key.pem 4096
$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr
$ echo extendedKeyUsage = clientAuth > extfile.cnf
$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem   -CAcreateserial -out cert.pem -extfile extfile.cnf
```

Base64エンコードしてやらないと Azure が読み込んでくれないので、エンコードしておく。

```bash
$ base64 ca.pem > ca64.pem
$ base64 server-cert.pem > server-cert64.pem
$ base64 server-key.pem > server-key64.pem
```
できあがり。

Azureに食べさせる用の３つと、接続する管理クライアント用の３つを tar で固める。（SCPして取り出すため）

```bash
$ tar cvzf forAzure.tar ca64.pem server-cert64.pem server-key64.pem
$ tar cvzf forClient.tar cert.pem client.csr key.pem
```
この２つの tarボール を、scpで接続するなりしてローカルに持ってきて、解凍しておく。
で、サーバのファイルはセキュリティのためにお掃除しておきましょう。

```bash
$ rm -v forAzure.tar forClient.tar
$ rm -v client.csr server.csr
$ chmod -v 0400 ca-key.pem key.pem server-key.pem
$ chmod -v 0444 ca.pem server-cert.pem cert.pem
```

ここまでできたら、VMにDocker機能をセットアップする。


# Docker拡張機能をAzuerポータルからVMにセットアップ

1. Azureの[『新しいポータル』](https://portal.azure.com/)に移動。（古い方のポータルだとDocker拡張機能をインストールするUIがないので注意。）

2. 仮想マシン（クラシック）⇒ 対象のVMを選択 ⇒ 拡張機能 ⇒「＋追加」で「Docker」を選択。
3. 証明書とキーファイルが要求されるので、ローカルに持ってきて解凍した forAzure.tar の中身をアップロードする。
4. ポート番号はお好きに設定。
5. このままだと外部から接続できないままなので、再度、
仮想マシン（クラシック）⇒ 対象のVMを選択 ⇒ エンドポイント から
設定したポート番号を登録。

数分待つと、Docker拡張機能のインストールが終わって使えるようになります。


# MacからDockerを操作したい

とりあえず、手許のMacから操作してみましょう。
Macでコンソールを開いて操作して下さい。

MacPortが入ってないひとは↓からダウンロードしてきてインストール。（HomeBrewでもいいですが）
https://www.macports.org/install.php

まだ XCode を使ったことない人は、インストール前にライセンス認証が必要。

```bash
$ sudo xcodebuild -license
```
MacPortを使ってローカルのMacに Docker をインストール。

```bash
$ sudo port install docker
```

forClient.tar の中身のクライアント証明書ファイル３つを `~/.docker` ディレクトリにコピー
`cert.pem` `client.csr` `key.pem`

# Dockerに接続！

ここまで来たらもうDockerをコントロールできるようになっています。
試してみよう。

```bash
$ docker --tls -H tcp://{ServerFQDN}:{PortNo} info
```
{ServerFQDN} には docker.cloudapp.net のような自分のVMのDNS名
{PortNo} には Docker拡張機能 のセットアップ時に設定したポート番号
をそれぞれ入れる。

こんな結果が表示されたらＯＫ。

```text
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.19.0-28-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 1
Total Memory: 668.6 MiB
Name: docker01
ID: 7W5C:RHS5:AZRQ:Y3DK:HLMC:CRS6:WG2B:WRBH:OKGU:6YKL:MQB3:GOCO
WARNING: No swap limit support
```

次は Docker を操作して、実際にサービスを立ち上げるところをやってみます。
（続く）

もしよく分からないこととかありましたら、コメントどしどし入れて下さい。
できるだけ回答します。（たぶん。笑）


***
（参考URL）
https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-docker-with-portal/
http://docs.docker.com/articles/https/