ようへいの日々精進XP

よかろうもん

docker-machine with Microsoft Azure Tutorial

tl;dr

docker-machine 色々な環境でを試すにあたって Microsoft Azure で試してみることにした。尚、諸事情によりお小遣い額の削減の為、無料枠内での利用に留める。


docker-machine と Microsoft Azure 事前情報

参考

ヘルプ抜粋

% docker-machine create --help 2>&1 | grep azure
   --azure-docker-port "2376"                                                                                           Azure Docker port
   --azure-docker-swarm-master-port "3376"                                                                              Azure Docker Swarm master port
   --azure-image                                                                                                        Azure image name. Default is Ubuntu 14.04 LTS x64 [$AZURE_IMAGE]
   --azure-location "West US"                                                                                           Azure location [$AZURE_LOCATION]
   --azure-password                                                                                                     Azure user password
   --azure-publish-settings-file                                                                                        Azure publish settings file [$AZURE_PUBLISH_SETTINGS_FILE]
   --azure-size "Small"                                                                                                 Azure size [$AZURE_SIZE]
   --azure-ssh-port "22"                                                                                                Azure SSH port
   --azure-subscription-cert                                                                                            Azure subscription cert [$AZURE_SUBSCRIPTION_CERT]
   --azure-subscription-id                                                                                              Azure subscription ID [$AZURE_SUBSCRIPTION_ID]
   --azure-username "ubuntu"                                                                                            Azure username
   --driver, -d "none"                                                                                                  Driver to create machine with. Available drivers: amazonec2, azure, digitalocean, exoscale, generic, google, none, openstack, rackspace, softlayer, virtualbox, vmwarefusion, vmwarevcloudair, vmwarevsphere

チュートリアル

チュートリアル環境

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F27

% docker-machine --version
docker-machine version 0.4.0 (9d0dc7a)

事前にアカウントを作成しておく

無料期間 30 日間。使い切りたい。

f:id:inokara:20150827162714p:plain

証明書とキーファイルの作成

# ディレクトリ作成
% mkdir ~/Documents/azure/
% cd ~/Documents/azure/

# 秘密鍵作成、CSR 作成、自己署名
% openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout azure.pem -out azure.pem
Generating a 1024 bit RSA private key
..............++++++
.........++++++
writing new private key to 'azure.pem'
-----
You are about to be asked to enter information that will be incorporated

(snip)

Email Address []:

# pem から pkcs12 形式に変換
% openssl pkcs12 -export -out azure.pfx -in azure.pem -name "docker-machine"
Enter Export Password:
Verifying - Enter Export Password:

# pem 形式から der 形式に変換
% openssl x509 -inform pem -in azure.pem -outform der -out azure.cer

証明書の登録

der 形式に変換した証明書をアップロードして Azure に登録する。

f:id:inokara:20150827163134p:plain

ポータルより [設定] → [管理証明書] にて証明書をアップロードする。

docker マシンの起動

以下のように docker-machine create を実行する。

% docker-machine create \
  --driver azure \
  --azure-subscription-id="xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx" \
  --azure-subscription-cert="azure.pem" \
  --azure-location "Japan West" \
  --azure-ssh-port "12345" \
  --azure-username "ubuntu" \
  --azure-password "YourP@ssword12345" \
azure-docker01

Creating Azure machine...

レスポンスが返ってこない場合でも以下のように azure cli仮想マシンの状態を確認する。

% azure vm list
info:    Executing command vm list
+ Getting virtual machines                                                     
data:    Name            Status            Location    DNS Name                     IP Address 
data:    --------------  ----------------  ----------  ---------------------------  -----------
data:    azure-docker01  RoleStateUnknown  Japan West  azure-docker01.cloudapp.net  100.78.6.55
info:    vm list command OK

以下のように出力されたらようやく仮想マシン作成完了。

(snip)

azure-docker01
Creating Azure machine...
To see how to connect Docker to this machine, run: docker-machine env azure-docker01

以下のように環境変数を設定する。

% eval $(docker-machine env azure-docker01)

docker info を実行して確認する。

% docker info
Containers: 1
Images: 2
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 4
 Dirperm1 Supported: false
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-36-generic
Operating System: Ubuntu 14.04.1 LTS
CPUs: 1
Total Memory: 1.639 GiB
Name: azure-docker01
ID: ZSL7:XEOK:YK4P:55BJ:XEAR:GEYT:LORJ:QOGB:GAMC:UIXC:TS3B:Z54W
WARNING: No swap limit support
Labels:
 provider=azure

一応、SSH でも仮想マシンにログインする。

% ssh ubuntu@azure-docker01.cloudapp.net -p 12222 'sudo docker version'
ubuntu@azure-docker01.cloudapp.net's password: 
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:35:49 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:35:49 UTC 2015
 OS/Arch:      linux/amd64

hello-world コンテナ

まずは hello-world コンテナ。

% cd ~/Documents/azure/

# docker run
% docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Pull complete
Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/

ひとまず満足。

nginx コンテナ

次に nginx コンテナも。

# docker run
% docker run -d --publish=80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
2c49f83e0b13: Pull complete 

(snip)

cd3cf76a61ee: Pull complete 
Digest: sha256:e2dbdc9824482b79050a67c1e6143365d0eeefcc77bf0e22cc2715d91b8d1ad4
Status: Downloaded newer image for nginx:latest
12a29bda692249963b3f5aebdde4db17b74d075008fff07e09b63e5b69643324
% docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
12a29bda6922        nginx               "nginx -g 'daemon off"   9 seconds ago       Up 8 seconds        0.0.0.0:80->80/tcp, 443/tcp   silly_torvalds

エンドポイントを設定して外部からアクセスする。

# エンドポイントの設定例
% azure vm endpoint create \
  --name <endpoint-name> \
  <vm-name> \
  <public-port> \
  [local-port]

# エンドポイントの設定
% azure vm endpoint create \
  --name http \
  azure-docker01 \
  80 \
  80                                                                                         
info:    Executing command vm endpoint create
+ Getting virtual machines
+ Reading network configuration
+ Updating network configuration
info:    vm endpoint create command OK

# エンドポイントの確認()
% azure vm endpoint list azure-docker01
info:    Executing command vm endpoint list
+ Getting virtual machines
data:    Name    Protocol  Public Port  Private Port  Virtual IP     EnableDirectServerReturn  Load Balanced
data:    ------  --------  -----------  ------------  -------------  ------------------------  -------------
data:    docker  tcp       2376         2376          xxx.xxx.xx.xx  false                     No
data:    http    tcp       80           80            xxx.xxx.xx.xx  false                     No
data:    ssh     tcp       12222        22            xxx.xxx.xx.xx  false                     No
info:    vm endpoint list command OK

# curl でアクセス
% curl -I http://azure-docker01.cloudapp.net/
HTTP/1.1 200 OK
Server: nginx/1.9.4
Date: Thu, 27 Aug 2015 07:11:24 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 18 Aug 2015 16:09:59 GMT
Connection: keep-alive
ETag: "55d358d7-264"
Accept-Ranges: bytes

Azure CLI メモ

ブラウザで操作

も悪くは無かったけど、せっかくなので Azure CLI という Node.js で書かれたコマンドラインツールを利用してみる。

参考

Azure CLI のインストール

上記を参考にしてパッケージよりインストール。

バージョン確認

% azure --version
0.9.8 (node: 0.12.7)

発行設定ファイルのダウンロード

Azure サブスクリプションに接続する為に azure account download を実行する。

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

実行するとブラウザが起動して以下のようなページが表示される。

f:id:inokara:20150827163756p:plain

here をクリックすると ◯◯◯◯◯-x-xx-xxxx-credentials.publishsettings というファイルがダウンロードされる。

発行設定ファイルのインポートと確認

上記にてダウンロードした ◯◯◯◯◯-x-xx-xxxx-credentials.publishsettings をインポートする。

# インポート
% azure account import /path/to/◯◯◯◯◯-x-xx-xxxx-credentials.publishsettings
info:    Executing command account import
info:    account import command OK

# 確認
% azure account list
info:    Executing command account list
data:    Name   Id                                    Tenant Id  Current
data:    -----  ------------------------------------  ---------  -------
data:    ◯◯◯◯◯  xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx  undefined  true   
info:    account list command OK
% 

仮想マシン一覧の確認

  • vm list オプションを利用する

以下、実行例。

% azure vm list
info:    Executing command vm list
+ Getting virtual machines                                                     
data:    Name            Status     Location    DNS Name                     IP Address 
data:    --------------  ---------  ----------  ---------------------------  -----------
data:    azure-docker01  ReadyRole  Japan West  azure-docker01.cloudapp.net  xxx.xx.x.xxx
info:    vm list command OK

エンドポイント一覧の確認

  • エンドポイントは AWS 的にはセキュリティグループという認識
  • vm endpoint list <vm-name> オプションを利用する

以下、実行例。

% azure vm endpoint list azure-docker01
info:    Executing command vm endpoint list
+ Getting virtual machines                                                     
data:    Name    Protocol  Public Port  Private Port  Virtual IP     EnableDirectServerReturn  Load Balanced
data:    ------  --------  -----------  ------------  -------------  ------------------------  -------------
data:    docker  tcp       2376         2376          xxx.xxx.xx.xx  false                     No           
data:    ssh     tcp       12222        22            xxx.xxx.xx.xx  false                     No           
info:    vm endpoint list command OK

エンドポイントの ACL 一覧の確認

  • エンドポイントのソース IP は「ACL の管理」にて管理する
  • vm endpoint acl-rule list <vm-name> <endpoint-name> オプションを利用する
% azure vm endpoint acl-rule list azure-docker01 ssh
info:    Executing command vm endpoint acl-rule list
+ Getting virtual machines                                                     
data:    Order  Action  RemoteSubnet       Description
data:    -----  ------  -----------------  -----------
data:    0      permit  xxx.xxx.xxx.xxx/32             
info:    vm endpoint acl-rule list command OK

ちなみに、ACL の登録は以下のように。

# example
% azure vm endpoint acl-rule create \
  --vm-name <vm-name> \
  --endpoint-name <endpoint-name> \
  --order [0..n] \
  --action [permit|deny] \
  --remote-subnet xxx.xxx.xxx.xxx/32

# 0.0.0.0/0 からの SSH エンドポイントへのアクセスを拒否ルールをオーダー番号 1 番で作成する
% azure vm endpoint acl-rule create \
  --vm-name  azure-docker01 \
  --endpoint-name ssh \
  --order 1 \
  --action deny \
  --remote-subnet 0.0.0.0/0

以下のように設定される。

f:id:inokara:20150828064803p:plain

サービスの確認

サービスの一覧を取得する。

% azure service list
info:    Executing command service list
+ Getting cloud services                                                       
data:    Name            Location    Affinity Group
data:    --------------  ----------  --------------
data:    azure-docker01  Japan West                
info:    service list command OK

リージョンの確認

リージョンの一覧を取得する。

% azure vm location list
info:    Executing command vm location list
+ Getting locations                                                            
data:    Name            
data:    ----------------
data:    Central US      
data:    South Central US
data:    East US         
data:    West US         
data:    East US 2       
data:    North Europe    
data:    West Europe     
data:    Southeast Asia  
data:    East Asia       
data:    Japan West      
info:    vm location list command OK

色々とサブコマンドを取り扱っているようだ。

$ azure.cmd
info:             _    _____   _ ___ ___
info:            /_\  |_  / | | | _ \ __|
info:      _ ___/ _ \__/ /| |_| |   / _|___ _ _
info:    (___  /_/ \_\/___|\___/|_|_\___| _____)
info:       (_______ _ _)         _ ______ _)_ _
info:              (______________ _ )   (___ _ _)
info:
info:    Microsoft Azure: Microsoft's Cloud Platform
info:
info:    Tool version 0.9.8
help:
help:    Display help for a given command
help:      help [options] [command]
help:
help:    Log in to an Azure subscription using Active Directory. Currently, the user can login only via Microsoft organizational account
help:      login [options] [username]
help:
help:    Log out from Azure subscription using Active Directory. Currently, the user can log out only via Microsoft organizational account
help:      logout [options] [username]
help:
help:    Open the portal in a browser
help:      portal [options]
help:
help:    Commands:
help:      account        Commands to manage your account information and publish settings
help:      config         Commands to manage your local settings
help:      hdinsight      Commands to manage HDInsight clusters and jobs
help:      mobile         Commands to manage your Mobile Services
help:      network        Commands to manage your networks
help:      sb             Commands to manage your Service Bus configuration
help:      service        Commands to manage your Cloud Services
help:      site           Commands to manage your Web Sites
help:      sql            Commands to manage your SQL Server accounts
help:      storage        Commands to manage your Storage objects
help:      vm             Commands to manage your Virtual Machines
help:
help:    Options:
help:      -h, --help     output usage information
help:      -v, --version  output the application version
help:
help:    Current Mode: asm (Azure Service Management)

コマンドラインツールには ARMASM という二種類のモードがあるようだ。

Azure CLI では、データベース サーバー、データベース、Web サイトなど、ユーザー管理のエンティティである個々のリソースに対して管理操作を実行できます。これは Azure CLI の既定の動作モードであり、Azure サービス管理と呼ばれています。ただし、複数のリソースで構成された複雑なソリューションがあるときは、ソリューション全体を 1 つの論理単位として管理できるようにすると便利です。1 つの論理単位 (resource group) としてリソースのグループを管理できるように、Azure のリソースを管理する新しい方法として、リソース マネージャーのプレビュー版が導入されています。

ASM がデフォルトで ARM がプレビュー版という位置づけかな?


まだまだ

Hello Azure 状態

色々と解らないことが多い。例えば...

ちなみに、上記の疑問に関しては以下の資料で少し理解。

www.slideshare.net

  • 発行設定ファイルって何?
  • 独自の用語諸々

まだ理解出来ていない。

docker-machine は

  • Mac 環境で docker-machine 弄る分には特に躓くことは無かった
  • Windows 環境で docker-machine で Azure 環境を弄ろうとすると少し苦労した(のは別途書く)
  • Azure では仮想ネットワーク内に Docker マシンを起動したい気がするけど issue は上がっているものの未サポート