Webサービスといえば今やクラウドが当たり前ですが、フレキシブルにスケールアウトさせたり、ステージング環境からプロダクション環境を構成したりと、Dockerの出番はあちこちにあります。ChefやVagrantでDevOpsを実現する方法が流行っていましたが、これからDocker全盛の時代になっていくでしょう。
DockerはLinuxでしか使えませんが、Windows向きと思われているAzureでもしっかりDocker対応はされています。ただ、まとまった情報や、分かりやすくスタートできそうな手順がなかったので、書き上げておくことにしました。
何はともあれ、まずはVMが必要ですから、LinuxのVMを立てます。
VMの立ち上げ
AzureでVMを立ち上げるのは簡単。Azureポータルからウイザードに従って設定するだけ。
- AzureポータルにログインしてVMを作成。
- 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にセットアップ
-
Azureの『新しいポータル』に移動。(古い方のポータルだとDocker拡張機能をインストールするUIがないので注意。)
-
仮想マシン(クラシック)⇒ 対象のVMを選択 ⇒ 拡張機能 ⇒「+追加」で「Docker」を選択。
-
証明書とキーファイルが要求されるので、ローカルに持ってきて解凍した forAzure.tar の中身をアップロードする。
-
ポート番号はお好きに設定。
-
このままだと外部から接続できないままなので、再度、
仮想マシン(クラシック)⇒ 対象の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/