AzureでDockerしよう(準備編)


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

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

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

VMの立ち上げ

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

証明書を作成する

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

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

$ 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が空のため)します。
※ ここでわざわざ環境変数にセットしなくても良いんですが、今後このスクリプトを自動化するかも知れないので、念のため。

$ export HOST=docker01-ict.cloudapp.net

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

$ echo subjectAltName = IP:127.0.0.1 > extfile.cnf
$ 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 が読み込んでくれないので、エンコードしておく。

$ base64 ca.pem > ca64.pem
$ base64 server-cert.pem > server-cert64.pem
$ base64 server-key.pem > server-key64.pem

できあがり。

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

$ tar cvzf forAzure.tar ca64.pem server-cert64.pem server-key64.pem
$ tar cvzf forClient.tar cert.pem client.csr key.pem

この2つの tarボール を、scpで接続するなりしてローカルに持ってきて、解凍しておく。
で、サーバのファイルはセキュリティのためにお掃除しておきましょう。

$ 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の『新しいポータル』に移動。(古い方のポータルだと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 を使ったことない人は、インストール前にライセンス認証が必要。

$ sudo xcodebuild -license

MacPortを使ってローカルのMacに Docker をインストール。

$ sudo port install docker

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

Dockerに接続!

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

$ docker --tls -H tcp://{ServerFQDN}:{PortNo} info

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

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

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/