例: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:パーソナル・アクセス・トークンの生成¶
アクセス・トークンを生成します。
- Digital Ocean 管理コンソールに移動し、ヘッダの API をクリックします。
- Generate New Token (新しいトークンの作成)をクリックし、トークンを生成します。
- トークンに適切な名前(例:「machine」)を付け Write (Optional) のチェックボックスにチェックを入れ、 Generate Token (トークン生成)をクリックします。
- 生成された HEX (16進数の文字列)を取得(クリップボードにコピー)し、どこか安全な場所に保管します。
ここで作成したパーソナル・アクセス・トークンは、次のステップでクラウド・サーバを作成するために使います。
ステップ3:Docker Machine のインストール¶
- Docker Machine をローカルの環境に入ってなければ、インストールします。
- Mac OS X に Docker Machine をインストール
- Windows に Docker Machine をインストール
- Docker Machine を直接インストール (例:Linux 等)
- コマンド・ターミナル上で
docker-machine ls
を使い Docker Machine の一覧と状態を表示します。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
default * virtualbox Running tcp:////xxx.xxx.xx.xxx:xxxx
- Docker コマンドを実行して、 Docker Engine が起動・実行中であることを確認します。
docker run hello-world
を実行でしますが、 docker ps
や docker 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 create
で digitalocean
ドライバを指定します。また、
--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 を経由してリモートからの接続を受け付けるよう設定されています。
- Digital Ocean のコンソールに移動し、新しいドロップレットを確認します。
- コマンド・ターミナルで
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)"
- 再び
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
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": "",
...
- 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
をコマンドを実行します。
create コマンドのデフォルト・オプションを理解する¶
利便性を高めるため、 docker-machine
には各サーバを起動するために、イメージ名の指定など実用的なデフォルト・オプションを適用しています。しかし、オプションはそれぞれのフラグ(例: --digitalocean
)を指定して上書きできます。クラウドサーバに多くのメモリや CPU を使いたい時に便利です(デフォルトの docker-machine
は小さなホストを作成します)。利用可能なフラグや設定の詳細に関しては、Docker Machine ドキュメントの ドライバのオプションと、デフォルト OS や create をご覧ください。
ステップ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
コマンドを実行してホストを削除します。
次はどこへ行きますか¶
- サポートしているドライバ
- Docker Machine 概要
- Docker Machine をクラウド・プロバイダで使う
- Docker Engine のインストール
- Docker Engine ユーザ・ガイド
参考
- Example: Use Docker Machine to provision cloud hosts
- https://docs.docker.com/engine/installation/cloud/cloud-ex-machine-ocean/