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 フラグを使います。

それでは実際に作業してみましょう。

  1. Digital Ocean の管理コンソールに移動し、ページ上方の “API” をクリックする。
  2. “Generate New Token”(新しいトークンの生成)をクリックする。
  3. トークンに適切な名前(例:”machine”)を指定し、”Write” チェックボックスにチェックを入れ、”Generate Token”(トークン生成)をクリックします。
  4. 長い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