Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

Organization

Docker MachineでDockerをクラウドにプロビジョニング

Docker Machineを使うと一発でネットワークやセキュリティのセットアップ→インスタンス作成→SSHセットアップ→Dockerインストール&セットアップまでやってくれる(実際にこの順序で行っているかどうかは未確認)。
以下、EC2とGCEについて例示。Docker Machineおよびクラウドのアカウントのセットアップは完了しているものとする。基本的に必須オプションのみ挙げるので、それ以外のオプションはリファレンスを参照のこと。

全般的な情報

ドライバについて

Docker Machineにはドライバという概念がある。Docker MachineはVirtualBoxの仮想サーバーやクラウドのインスタンスをmachineという形で抽象化する。EC2上のmachineに接続するときにはEC2のドライバ、GCE上のmachineに接続するときにはGCEのドライバを介することで、ユーザーはmachineを統一的なインターフェイスで操作できるようになる。
ユーザーがドライバを意識する必要があるのは、machineを作成するときだけ。ドライバごとにオプションが異なる。用意されているドライバおよびそのリファレンスは以下を参照。

OSについて

デフォルトではローカルならBoot2Docker、リモートならUbuntu LTS。例えばEC2ならAMI指定をしてすることで、別のOSを選択することもできる。対応しているOSは以下を参照。

注意点として、デフォルト以外のOSイメージを使う場合は、ユーザー名をそのイメージのデフォルトユーザーに設定する必要がある。上記ページにも書いてあるが、例えばEC2でRed Hat AMIを使う場合はec2-userがデフォルトユーザー名なので、--amazonec2-ssh-user ec2-userをオプションで指定する必要がある。オプション名はドライバによって異なる。

machine作成

EC2

create
docker-machine create ec2 \
 --driver amazonec2 \
 --amazonec2-access-key (アクセスキーID) \
 --amazonec2-secret-key (シークレットアクセスキー) \
 --amazonec2-vpc-id (VPC ID) \
 --amazonec2-region (リージョン) --amazonec2-zone (ゾーン)

リージョンとゾーンは必須ではないものの、デフォルトとしてus-east-1cが使われるというだけなので、実質的に必須。認証方法としては現時点ではアクセスキーしか使えない。

これですべてが完了。AWSのSDKもいらない。簡単。

Google Compute Engine

create
docker-machine create gcloud --driver google --google-project (任意のプロジェクト)

実行すると、OAuth認証のためブラウザが起動する。ブラウザが起動できない環境の場合は、URLが表示されるので、コピー&ペーストでアクセスして認証。

これで完了。同じくSDK不要。

接続方法

activeなホストに設定(env)

以下EC2のmachineで説明するが、前述のとおり、machineを作成してしまえば、あとの操作は同じインターフェイスで行える(ただし挙動は異なることがある)。

machineを作成すると、接続するにはdocker-machine env ec2を実行しろと言われるので、実行してみる。

env
$ docker-machine env ec2
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://*.*.*.*:2376"
export DOCKER_CERT_PATH="/Users/masahiro/.docker/machine/machines/ec2"
export DOCKER_MACHINE_NAME="ec2"
# Run this command to configure your shell: 
# eval "$(docker-machine env ec2)"

一連のexportコマンドが出力される。これを.bash_profileにでも書いておけば、デフォルトでこのホストがactiveになる。dockerコマンドは自動的にactiveなホストに接続する。ようするに、普通にdockerコマンドを使えばactiveなホスト上のdockerが操作できる。

あるいは、再び言われたとおりeval "$(docker-machine env ec2)"を実行すると、このホストがactiveになる。activeはactiveなホストを確認するだけのコマンド。activeなホストはlsでも確認できる。

env,active,ls
$ eval "$(docker-machine env ec2)"
$ docker-machine active
ec2
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default            virtualbox   Running   tcp://192.168.99.100:2376   
ec2       *        amazonec2    Running   tcp://*.*.*.*:2376     

ホストをactiveにせずに接続(config)

activeなホストを切り替えずに特定のホストを使いたい場合には、configが有用。configコマンドはホストへの接続情報をdockerコマンドのオプションの形で出力する。docker $(docker-machine config ec2) psのようにして使うとよい。

config
$ docker-machine config ec2
--tlsverify --tlscacert="/Users/masahiro/.docker/machine/machines/ec2/ca.pem" --tlscert="/Users/masahiro/.docker/machine/machines/ec2/cert.pem" --tlskey="/Users/masahiro/.docker/machine/machines/ec2/key.pem" -H=tcp://*.*.*.*:2376
$ docker $(docker-machine config ec2) ps
CONTAINER ID        IMAGE                                           COMMAND                  CREATED             STATUS              PORTS                                                                                                      NAMES

machineの開始、停止、削除

stat,stop,rm
docker-machine start ec2
docker-machine stop ec2
docker-machine rm ec2

ここはEC2とGCEで挙動が異なった。
EC2の場合はstopでstop、rmでterminateなのでわかりやすい。
それに対して、GCEはstopでインスタンスが削除されてしまう(EC2のstopに対応する状態がない)。ローカルにmachineの情報は残っているので、startすれば再び同じオプションでインスタンスが作成されるが、当然コンテナ等のデータはすべて消えている。

実行環境

実行環境
$ date
2015年 9月30日 水曜日 11時10分23秒 JST
$ docker -v
Docker version 1.8.1, build d12ea79
$ docker-machine -v
docker-machine version 0.4.1 (e2c88d6)
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F27
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?