Docker Machineを使うと一発でネットワークやセキュリティのセットアップ→インスタンス作成→SSHセットアップ→Dockerインストール&セットアップまでやってくれる(実際にこの順序で行っているかどうかは未確認)。
以下、EC2とGCEについて例示。Docker Machineおよびクラウドのアカウントのセットアップは完了しているものとする。基本的に必須オプションのみ挙げるので、それ以外のオプションはリファレンスを参照のこと。
全般的な情報
ドライバについて
Docker Machineにはドライバという概念がある。Docker MachineはVirtualBoxの仮想サーバーやクラウドのインスタンスをmachineという形で抽象化する。EC2上のmachineに接続するときにはEC2のドライバ、GCE上のmachineに接続するときにはGCEのドライバを介することで、ユーザーはmachineを統一的なインターフェイスで操作できるようになる。
ユーザーがドライバを意識する必要があるのは、machineを作成するときだけ。ドライバごとにオプションが異なる。用意されているドライバおよびそのリファレンスは以下を参照。
- Supported Drivers https://docs.docker.com/machine/drivers/
OSについて
デフォルトではローカルならBoot2Docker、リモートならUbuntu LTS。例えばEC2ならAMI指定をしてすることで、別のOSを選択することもできる。対応しているOSは以下を参照。
- Driver options and operating system defaults https://docs.docker.com/machine/drivers/os-base/
注意点として、デフォルト以外のOSイメージを使う場合は、ユーザー名をそのイメージのデフォルトユーザーに設定する必要がある。上記ページにも書いてあるが、例えばEC2でRed Hat AMIを使う場合はec2-user
がデフォルトユーザー名なので、--amazonec2-ssh-user ec2-user
をオプションで指定する必要がある。オプション名はドライバによって異なる。
machine作成
EC2
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
docker-machine create gcloud --driver google --google-project (任意のプロジェクト)
実行すると、OAuth認証のためブラウザが起動する。ブラウザが起動できない環境の場合は、URLが表示されるので、コピー&ペーストでアクセスして認証。
これで完了。同じくSDK不要。
接続方法
activeなホストに設定(env)
以下EC2のmachineで説明するが、前述のとおり、machineを作成してしまえば、あとの操作は同じインターフェイスで行える(ただし挙動は異なることがある)。
machineを作成すると、接続するにはdocker-machine env ec2
を実行しろと言われるので、実行してみる。
$ 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
でも確認できる。
$ 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
のようにして使うとよい。
$ 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の開始、停止、削除
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