tl;dr
docker-machine 色々な環境でを試すにあたって Microsoft Azure で試してみることにした。尚、諸事情によりお小遣い額の削減の為、無料枠内での利用に留める。
docker-machine と Microsoft Azure 事前情報
参考
- https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-docker-machine/
- https://docs.docker.com/machine/drivers/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 日間。使い切りたい。
証明書とキーファイルの作成
# ディレクトリ作成 % 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 に登録する。
ポータルより [設定] → [管理証明書] にて証明書をアップロードする。
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 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 で書かれたコマンドラインツールを利用してみる。
参考
- https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-command-line-tools/
- https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-connect/
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
実行するとブラウザが起動して以下のようなページが表示される。
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
以下のように設定される。
サービスの確認
サービスの一覧を取得する。
% 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)
コマンドラインツールには ARM
と ASM
という二種類のモードがあるようだ。
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 は上がっているものの未サポート