例:Docker Machine でクラウド・ホストを自動構築

Docker Machine ドライバ・プラグインは多くのクラウド・プラットフォームに対応しています。Docker Machine を使えばクラウド・ホストをプロビジョン(自動構築)できます。Docker Machine でプロビジョニングすると、Docker Engine がインストールされたクラウド・ホストを作成します。

必要なのは Docker Machine のインストールと実行、そして、クラウド・プロバイダのアカウントです。

それから、アカウント認証やセキュリティ証明書を取得し、 docker-machine create でプロバイダ用のオプションをフラグとして指定します。フラグはクラウド・プロバイダによって違います。例えば Digital Ocean のアクセス・トークンを指定するには --digitalocean-access-token フラグを使います。

それでは、例として Docker に対応した Digital Ocean ドロップレット(クラウド・サーバ)の作成方法を見ていきましょう。

ステップ1:Digital Ocean アカウントの作成とログイン

Digital Ocean のアカウントを持っていなければ、サイトに移動してアカウントを作成し、ログインします。

ステップ2:パーソナル・アクセス・トークンの生成

アクセス・トークンを生成します。

  1. Digital Ocean 管理コンソールに移動し、ヘッダの API をクリックします。
Digital Ocean コンソールの API をクリック
  1. Generate New Token (新しいトークンの作成)をクリックし、トークンを生成します。
トークンの生成
  1. トークンに適切な名前(例:「machine」)を付け Write (Optional) のチェックボックスにチェックを入れ、 Generate Token (トークン生成)をクリックします。
トークン名を入れてトークンを生成
  1. 生成された HEX (16進数の文字列)を取得(クリップボードにコピー)し、どこか安全な場所に保管します。
パーソナル・アクセス・トークンをコピー&保存

ここで作成したパーソナル・アクセス・トークンは、次のステップでクラウド・サーバを作成するために使います。

ステップ3:Docker Machine のインストール

  1. Docker Machine をローカルの環境に入ってなければ、インストールします。
  1. コマンド・ターミナル上で docker-machine ls を使い Docker Machine の一覧と状態を表示します。
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp:////xxx.xxx.xx.xxx:xxxx
  1. Docker コマンドを実行して、 Docker Engine が起動・実行中であることを確認します。

docker run hello-world を実行でしますが、 docker psdocker run docker/whalesay cowsay boo など他のコマンドでも Docker が動いていることを確認できます。

$ docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.
...

ステップ4:Machine でドロップレットの作成

1. docker-machine createdigitalocean ドライバを指定します。また、 --digitalocean-access-token フラグでトークンの指定と、新しいクラウド・サーバの名前も指定します。

次の例では「docker-sandbox」という名称の新しいドロップレットを作成します。

$ docker-machine create --driver digitalocean --digitalocean-access-token xxxxx docker-sandbox
Running pre-create checks...
Creating machine...
(docker-sandbox) OUT | Creating SSH key...
(docker-sandbox) OUT | Creating Digital Ocean droplet...
(docker-sandbox) OUT | Waiting for IP address to be assigned to the Droplet...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning created instance...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
To see how to connect Docker to this machine, run: docker-machine env docker-sandbox

ドロップレットの作成時、Docker はユニークな SSH 鍵を生成し、それを自分のローカルシステム上の ~/.docker/machines の中に保存します。まず、これを使ってホストをプロビジョニン(自動作成)します。後から docker-machine ssh コマンドでドロップレットに直接接続する時にも、水面下で用います。クラウド・サーバ上には Docker Engine がインストールされており、TLS 認証を使った TCP を経由してリモートからの接続を受け付けるよう設定されています。

  1. Digital Ocean のコンソールに移動し、新しいドロップレットを確認します。
Docker Machine で作成された Digital Ocean ドロップレット
  1. コマンド・ターミナルで docker-machine ls を実行します。
$ docker-machine ls
NAME             ACTIVE   DRIVER         STATE     URL                         SWARM
default          *        virtualbox     Running   tcp://192.168.99.100:2376
docker-sandbox   -        digitalocean   Running   tcp://45.55.139.48:2376

新しいクラウド・サーバは実行中ですが、アクティブなホストではないのに注意してください。現時点では、まだ default マシンに対してシェルが接続されている状態です。アクティブ・ホストにはアスタリスク(*)印が付いています。

docker-machine env docker-sandbox を実行し、新しいリモート・ホストを参照するための環境変数を取得します。 eval を使えば直接 docker-sandbox に接続するようシェル上の設定を変更します。

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

$ eval "$(docker-machine env docker-sandbox)"
  1. 再び docker-machine ls を実行し、新しいサーバの ATCIVE 列にアスタリスク印(*)が付き、アクティブなホストになっていることを確認します。
$ docker-machine ls
NAME             ACTIVE   DRIVER         STATE     URL                         SWARM
default          -        virtualbox     Running   tcp://192.168.99.100:2376
docker-sandbox   *        digitalocean   Running   tcp://45.55.222.72:2376
  1. docker-machine コマンドを再び使い、リモートホストの状態を調べます。例えば、 docker-machine ip <マシン名> はホストの IP アドレスを取得します。 docker-machine inspect <マシン名> は全ての詳細を表示します。
$ docker-machine ip docker-sandbox
104.131.43.236

$ docker-machine inspect docker-sandbox
{
    "ConfigVersion": 3,
    "Driver": {
    "IPAddress": "104.131.43.236",
    "MachineName": "docker-sandbox",
   "SSHUser": "root",
    "SSHPort": 22,
    "SSHKeyPath": "/Users/samanthastevens/.docker/machine/machines/docker-sandbox/id_rsa",
    "StorePath": "/Users/samanthastevens/.docker/machine",
    "SwarmMaster": false,
    "SwarmHost": "tcp://0.0.0.0:3376",
    "SwarmDiscovery": "",
    ...
  1. Docker Engine が正常にインストールされたかを確認するため、 docker コマンドを実行します。

docker run hello-world のような基本的なコマンドを実行します。あるいは、新しいリモート・マシン上に Docker 化したウェブ・サーバの実行という、より面白いテストを行いましょう。

この例では nginx コンテナのポート 80 を公開するために -p オプションを使います。また、 docker-sandbox ホスト上のポート 8000 からアクセス可能なようにします。

$ docker run -d -p 8000:80 --name webserver kitematic/hello-world-nginx
Unable to find image 'kitematic/hello-world-nginx:latest' locally
latest: Pulling from kitematic/hello-world-nginx
a285d7f063ea: Pull complete
2d7baf27389b: Pull complete
 ...
Digest: sha256:ec0ca6dcb034916784c988b4f2432716e2e92b995ac606e080c7a54b52b87066
Status: Downloaded newer image for kitematic/hello-world-nginx:latest
942dfb4a0eaae75bf26c9785ade4ff47ceb2ec2a152be82b9d7960e8b5777e65

ウェブブラウザで http://<ホストIP>:8000 に移動し、ウェブサーバのホームページを表示します。 <ホストIP> の情報は、先ほどのステップにあった docker-machine ip <マシン名> で確認できます。どのポートが公開のために使われているかを調べるには docker run をコマンドを実行します。

nginx ウェブサーバ

create コマンドのデフォルト・オプションを理解する

利便性を高めるため、 docker-machine には各サーバを起動するために、イメージ名の指定など実用的なデフォルト・オプションを適用しています。しかし、オプションはそれぞれのフラグ(例: --digitalocean )を指定して上書きできます。クラウドサーバに多くのメモリや CPU を使いたい時に便利です(デフォルトの docker-machine は小さなホストを作成します)。利用可能なフラグや設定の詳細に関しては、Docker Machine ドキュメントの ドライバのオプションと、デフォルト OScreate をご覧ください。

ステップ5:Machine でドロップレットを削除

ホストやコンテナおよびイメージを削除するには、まずマシンを停止し、それから docker-machine rm を使います。

$ docker-machine stop docker-sandbox
$ docker-machine rm docker-sandbox
Do you really want to remove "docker-sandbox"? (y/n): y
Successfully removed docker-sandbox

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp:////xxx.xxx.xx.xxx:xxxx

Docker Ocean コンソールを開いていると、コマンドを実行したら状況が反映されます。 Droplete が停止した後に削除されるのが見えるでしょう。

Docker Machine でホストを作成しても、クラウド・プロバイダのコンソールを通しても削除できます。ただし、Docker Machine は状態を追跡できなくなります。そのため、 docker-machine --create コマンドでホストを作成した場合は、 docker-machine rm コマンドを実行してホストを削除します。