Docker Machine をクラウド・プロバイダで始めるには¶
ローカルの仮想環境を作り Docker を実行するのは、使いやすく面白いものです。しかし、Docker Machine ができることはそれだけではありません。Docker Machine には、複数の “ドライバ” をサポートしています。そのため、同じインターフェースを使いながらも、多くのクラウドまたはローカルの仮想化プラットフォームで Docker を実行するホストを作れます。これには docker-machine create
コマンドで --driver
フラグを指定するだけです。ここでは例として Digital Ocean ドライバ( digitalocean
と呼びます )を扱います。しかし、 Amazon Web Services、Google Compute Engine、Microsoft Azure をはじめとしたドライバがあります。
通常、docker-machine
でこれらのプロバイダを利用する時、アカウント認証用の証明書(credentaials)が必要です。このフラグは、ドライバ毎に指定方法が異なります。例えば、DigitalOcean のアクセス・トークンを使うには、--digitalocean-access-token
フラグを使います。
それでは実際に作業してみましょう。
- Digital Ocean の管理コンソールに移動し、ページ上方の “API” をクリックする。
- “Generate New Token”(新しいトークンの生成)をクリックする。
- トークンに適切な名前(例:”machine”)を指定し、”Write” チェックボックスにチェックを入れ、”Generate Token”(トークン生成)をクリックします。
- 長い16進数列を取得します。これが生成された(自分用のトークン)ものであり、安全な場所に保管します。
これで、docker-machine create
時に digitalocean
ドライバを指定し、自分の鍵を --digitalocean-access-token
フラグで指定します。
実行例:
$ docker-machine create \
--driver digitalocean \
--digitalocean-access-token 0ab77166d407f479c6701652cee3a46830fef88b8199722b87821621736ab2d4 \
staging
Creating SSH key...
Creating Digital Ocean droplet...
To see how to connect Docker to this machine, run: docker-machine env staging
便利な機能として、docker-machine
は仮想マシンの起動時に選択可能な設定、たとえばサーバイメージなどについては、実用的なデフォルト値を使います。とはいえ特定のフラグを使えば、その値の上書きは可能です(例: --digitalocean-image
)。これは便利なもので、例えば、多くのメモリや CPU を必要とする大きなインスタンスを作成できます(デフォルトの docker-machine
が作成するのは、小さな仮想マシンです)。利用可能なフラグや値、デフォルト設定については docker-machine create -h
の出力をご確認ください。
ホスト作成が始まるとまず、ホストに接続するためのユニークな SSH 鍵(初期のプロビジョングだけではなく、後の docker-machine ssh
コマンドでも使用)が自動的に作成され、クライアントの /.docker/machine
ディレクトリに保管されます。SSH 鍵を作成後、Docker がリモートマシン上にインストールされ、Docker デーモンは TLS を認証に使った TCP によるリモートからの接続を受け付けるよう、自動的に設定されます。これが終わればホストとの通信準備が整います。
Docker クライアントから作成したリモートのサーバに対してコマンドを送るには、シェル上で再びコマンドを実行します。
$ eval "$(docker-machine env staging)"
これを実行することで、先ほど作成したリモートホストが、ローカルホストのように振る舞います。ここで docker-machine ls
を見てみると、”active”(アクティブ)ホストの列に、アスタリスク(*)の印が表示されます。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL
dev virtualbox Running tcp://192.168.99.103:2376
staging * digitalocean Running tcp://104.236.50.118:2376
ホストとホスト上の全てのコンテナとイメージを削除するには docker-machine rm
を使います。
$ docker-machine rm dev staging
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL
ドライバを使わずにホストを追加¶
Docker ホストの追加は、ドライバを使わず URL でも可能です。URL で追加すれば、それ以降は追加したホストに対するエイリアス(別名)として利用できますので、毎回 Docker コマンドで URL を指定する必要がなくなります。
$ docker-machine create --url=tcp://50.134.234.20:2376 custombox
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL
custombox * none Running tcp://50.134.234.20:2376
Docker Machine で Docker Swarm を扱う¶
Docker Machine は Swarm クラスタのプロビジョニングも可能です。これにより、どのドライバを使っている場合でも、TLS で安全に通信できます。
使うためには、まず Swarm トークンを作成します。オプションとして、他のディスカバリ・サービスを使うことも可能です。詳細は Swarm のドキュメントをご覧ください。
トークンを作成したら、マシンを作成します。この例では VirtualBox を使います。
$ docker-machine create -d virtualbox local
マシンの設定をシェル上に読み込みます。
$ eval "$(docker-machine env local)"
それから、Swarm の Docker イメージを使い、トークンを生成します。
$ docker run swarm create
1257e0f0bbb499b5cd04b4c9bdb2dab3
トークンを作成後は、これを使ってクラスタを作成できます。
Swarm マスタ¶
Swarm マスタを次のように作成します。
docker-machine create \
-d virtualbox \
--swarm \
--swarm-master \
--swarm-discovery token://<先ほどのトークン> \
swarm-master
上の <先ほどのトークン>
の場所には、先ほど作成したランダムなトークンを入れます。このコマンドは、Swarm マスタを作成すると同時に、自分自身を Swarm ノードに追加します。
Swarm ノード¶
次は追加の Swarm ノードを作成します。
docker-machine create \
-d virtualbox \
--swarm \
--swarm-discovery token://<TOKEN-FROM-ABOVE> \
swarm-node-00
これで2つのノードにまたがる Swarm クラスタができました。Swarm マスタに接続するには、$(docker-machine env --swarm swarm-master)
を使います。
実行例:
$ docker-machine env --swarm swarm-master
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH="/home/ehazlett/.docker/machines/.client"
export DOCKER_HOST=tcp://192.168.99.100:3376
この環境を読み込むには、 eval "$(docker-machine env --swarm swarm-master)"
を使います。
Docker CLI を使うと、次のように表示されます。
$ docker info
Containers: 1
Nodes: 1
swarm-master: 192.168.99.100:2376
└ Containers: 2
└ Reserved CPUs: 0 / 4
└ Reserved Memory: 0 B / 999.9 MiB