Docker Machine ドキュメント参考日本語訳

# Docker Machine

[Docker Machine 0.3.0 のドキュメント](https://docs.docker.com/machine/)の参考日本語訳です。手許に翻訳したまま死蔵しておくのもアレなので、内容未保証の参考訳として公開します。

> メモ：Machine は原点ではベータ版のため、ここにある記述は変わる場合があります。本番環境（プロダクション）での利用は推奨しません。

Docker Machine は自分のコンピュータ上やクラウド・プロバイダ上や自身のデータセンタ内で Docker ホストを作成します。サーバを作成し、Docker をインストールしたあと、Docker クライアントが通信できるように設定します。

Docker ホストを作成後は、管理用の多くのコマンドが使えるようになります：

* 起動、停止、再起動
* Docker のアップグレード
* Docker クライアントとホストが通信できる設定

## ヘルプを得るには

Docker Machine は未だ初期段階であり活発に開発中です。もしヘルプが必要であれば、貢献するか、プロジェクト内で同様の考えを持っている方に話すなど、コミュニケーションのための数々のオープンなチャンネルを持っています。

* バグ報告や機能リクエストを送りたい場合：GitHub の [issue tracker](https://github.com/docker/machine/issues) をお使いください。 
* プロジェクトの人々とリアルタイムに会話したい場合：IRC の `#docker-machine` チャンネルに参加ください。
* コードやドキュメント更新に貢献したい場合：GitHub でプルリクエストをお送りください。

より詳しい情報やリソースに関しては、https://docs.docker.com/project/get-help/ を参照ください。

## インストール

Docker Machine は Windows、OS X、Linux でサポートされており、単体で動作するバイナリをインストールできます。以下は様々なプラットフォームやアーキテクチャに対するバイナリのリンクです：

* [Windows - 32bit](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_windows-386.exe)
* [Windows - 64bit](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_windows-amd64.exe)
* [OSX - x86_64](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_darwin-amd64)
* [OSX - (古い Mac OS)](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_darwin-386)
* [Linux - x86_64](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_linux-amd64)
* [Linux - i386](https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_linux-386)

### OS X と Linux

OS X や Linux へインストールするには、適切なバイナリをダウンロードし、環境変数`PATH`のパスが通った場所に設置し（例：`/usr/local/bin`）、実行可能にします。例えば、大部分の OS X マシンでは以下のコマンドを実行するだけで十分です：

```
$ curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_darwin-amd64 > /usr/local/bin/docker-machine
$ chmod +x /usr/local/bin/docker-machine
```

inux ではバイナリ名の「darwin」を「linux」に置き換えてください。
これで `docker-machine -v` コマンドを使うことでバージョンを確認できます。

```
$ docker-machine -v
machine version 0.3.0
```

作成したマシンに SSH を使わず Docker コマンドでログインできるようにするため、Docker クライアントを次のようにインストールしてください：

```
$ curl -L https://get.docker.com/builds/Darwin/x86_64/docker-latest > /usr/local/bin/docker
```

### Windows

現時点では Windows への Docker Machine のインストールに [msysgit](https://msysgit.github.io/) の使用を推奨します。これを使うことで、 Docker Machine が必要とする `ssh` や機能的なシェルといったプログラムが利用できます。

msysgit をインストールしたら、コマンドプロンプトを起動し、以下のコマンドを実行します。このインストールは 64-bit の Windows を想定しています。32-bit におけるインストールは、URL の "x86_64" は "i386" に置き換えてください。

はじめに、Docker クライアントのバイナリをインストールします：

```
$ curl -L https://get.docker.com/builds/Windows/x86_64/docker-latest.exe > /bin/docker
```

次に、Docker Mahcine ライブラリでインストールします：

```
$ curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_windows-amd64.exe > /bin/docker-machine
```

これで `docker-machine` が動くようになります。

```
$ docker-machine -v
machine version 0.3.0
```

## Docker Machine でローカルの仮想マシンを扱いましょう

それでは docker-machine を使い、[VirtualBox](https://www.virtualbox.org/) 中で Docker ホストを作成・使用・管理してみましょう。

まず [VirtualBox 4.3.28](https://www.virtualbox.org/wiki/Downloads) がシステム上にインストールされていることを確認ください。

`docker-machine ls` コマンドを実行すると、利用可能なマシンすべてが表示されます。今は何も表示されませんが、後ほど作成後に表示されます。

```
$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL
```

ホストを作成するには、`docker-machine create` コマンドを実行し、`--driver` フラグで `virtualbox` を指定します。引数の最後はマシン名を書きます。ここではマシン名を "dev" とします。

次のコマンドは、Docker デーモンがインストールずみの軽量な Linux ディストリビューション（[boot2docker](https://github.com/boot2docker/boot2docker)）をダウンロードします。それから Docker が稼働する VirtualBox の仮想マシンを作成・起動します。

```
$ docker-machine create --driver virtualbox dev
Creating CA: /home/username/.docker/machine/certs/ca.pem
Creating client certificate: /home/username/.docker/machine/certs/cert.pem
Image cache does not exist, creating it at /home/username/.docker/machine/cache...
No default boot2docker iso found locally, downloading the latest release...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.6.2/boot2docker.iso to /home/username/.docker/machine/cache/boot2docker.iso...
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env dev
```

`docker-machine ls` コマンドを再び実行すると、作成したマシンが稼働していることが見えます。

```
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM
dev             virtualbox   Running   tcp://192.168.99.100:2376
```

上で見た `docker-mahcine create` コマンドの出力結果の次に、Docker で対象マシンに対して通信する必要があります。これには `docker-machine env` コマンドを使います。例えば、
	
```
$ eval "$(docker-machine env dev)"
$ docker ps
```

メモ：`fish` を使っているか Powershell や `cmd.exe` のような Windows のシェルを使っている場合、上記のままでは動作しません。[`env` コマンドのドキュメント](https://docs.docker.com/machine/#env)を読み、自身のシェル上で環境変数を指定する方法を学んでください。

環境変数を設定することにより、Docker クライアントは TLS 設定の指定を読み込めます。新しいタブを開いたり、マシンを再起動するために実行する必要があるので、ご注意ください。

何を設定すべきかは `docker-machine env dev` を実行します。

```
$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.16.62.130:2376"
export DOCKER_CERT_PATH="/Users/<your username>/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell:
# eval "$(docker-machine env dev)"
```

これで対象上のホストに Docker コマンドを実行できます：

```
$ docker run busybox echo hello world
Unable to find image 'busybox' locally
Pulling repository busybox
e72ac664f4f0: Download complete
511136ea3c5a: Download complete
df7546f9f060: Download complete
e433a6c5b276: Download complete
hello world
```

Docker ホストの IP アドレスが何らかのポートを公開している場合は、`docker-machine ip` コマンドで知ることができます：

```
$ docker-machine ip dev
192.168.99.100
```

例えば、ウェブサーバ ([nginx](https://nginx.org/)) をコンテナで次のように実行しているとします。

```
$ docker run -d -p 8000:80 nginx
```

イメージの取得が完了すると、`docker-machine ip` によって表示される IP アドレスで、サーバのポート 8080 を叩けます。例えば、次の通りです：

```
$ curl $(docker-machine ip dev):8000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

再び `docker-machine create` を実行するだけで、多くの Docker が実行する仮想マシンを作成・管理することができます。作成したマシンの情報は、`docker-machine ls` の出力で表示されます。

さしあたっての利用が終われば、`docker-machine stop` を実行して停止し、また後で再開するときは `docker-machine start` を実行します。このとき、マシン名を引数として指定します。

```
$ docker-machine stop dev
$ docker-machine start dev
```

## クラウド・プロバイダで Docker Machine を使う

ローカルの仮想マシンで Docker を動かすことは便利で面白いのですが、Docker Machine の能力はそれだけではありません。Docker Machine には"ドライバ"と呼ばれる機能をサポートしており、多くの異なるクラウドやローカルの仮想化プラットフォーム上で、同じインターフェースでホストを作成できます。作成するには `docker-machine create` コマンドに `--driver` フラグを使うだけです。ここでは [Digital Ocean](https://digitalocean.com/) ドライバ（`digitalocean`という名前です）のデモを行いますが、他にも Amazon Web Services、Google Compute Engine、Microsoft Azure といった複数のプロバイダのドライバが利用可能です。

`docker-machine create` フラグをこれらのプロバイダで使う時は、通常はアカウント認証情報（ credentials ) を使います。必要となるフラグは、ドライバによって異なります。例えば、Digital Ocean のアクセス・トークンを使いたい場合は、`--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` は VPS を作成時、対象のイメージにあわせて適切な設定を行うデフォルト値を持っています。それだけでなく、必要があればフラグを指定して、その値を上書きするフラグも指定できます（例：`--digitalocean-image`）。使いやすい例としては、多くのメモリや CPU が利用可能な大きめのインスタンスを作れます（デフォルトの `docker-machine` は小さな VSP を作ります）。利用可能なフラグや設定値、デフォルト設定に関しては `docker-machine create -h` の出力をご確認ください。

ホスト作成時における初期設定時、ホストに接続するためのユニークな SSH 鍵（初期のプロビジョニングだけでなく、後から `docker-machine ssh` コマンドの実行時にも使用）が自動的に作成され、クライアントの `~/.docker/machines` ディレクトリに保管されます。SSH 鍵を作成後、Docker はリモートマシン上にデーモンをインストールし、リモートとは TCP を越えて TLS と通信できるよう自動的に設定を行います。これが終われば、ホストへの接続準備が整います。

作成したリモートサーバ上に 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-machie rm` を使います。

```
$ docker-machine rm dev staging
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL
```

## ドライバを使わずホストを追加するには

Docker のホストを追加するには、ドライバを使わずにURL でも指定できます。その場合は、既存のホストに URL を指定するとエイリアスとなるため、毎回 Docker コマンドを実行する必要はありません。

```
$ 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 Swarm で Docker Machine を使う

Docker Machine は [Swarm](https://github.com/docker/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://<TOKEN-FROM-ABOVE> \
    swarm-master
```

上の `<TOKEN-FROM-ABOVE>` の箇所は、自分用のランダムなトークンに置き換えてください。作成後は、Swarm マスタは自分自身を Swarm ノードとして登録します。

### Swarm ノード

次は Swarm ノードを作成します：

```
docker-machine create \
    -d virtualbox \
    --swarm \
    --swarm-discovery token://<TOKEN-FROM-ABOVE> \
    swarm-node-00
```

これで２つのノードにまたがる Swarm クラスタができました。Swarm マスタに接続するには、`eval $(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)"` を使います。

これで Dcker 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
```

## サブコマンド

### active

どのマシンが "active"（ `DOCKER_HOST` 環境変数によってアクティブ＝使用中と考えられるマシン）を表示します。

```
$ 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
$ echo $DOCKER_HOST
tcp://104.236.50.118:2376
$ docker-machine active
staging
```

### create

マシンを作成します。

```
$ docker-machine create --driver virtualbox dev
Creating CA: /home/username/.docker/machine/certs/ca.pem
Creating client certificate: /home/username/.docker/machine/certs/cert.pem
Image cache does not exist, creating it at /home/username/.docker/machine/cache...
No default boot2docker iso found locally, downloading the latest release...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.6.2/boot2docker.iso to /home/username/.docker/machine/cache/boot2docker.iso...
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env dev
```

#### create フラグのヘルプ文章をフィルタするには

`docker-machine create` コマンドは、プロバイダ毎に利用可能なオプションを指定するためのフラグが多くあるのでご注意ください。

```
$ docker-machine create -h | wc -l
145
```

全ての情報を表示するのは大変なので、自分が操作しているドライバに対する適切なフラグ群のみをシンプルに表示できます。create 時、プロバイダ毎に適切なフラグのみ表示したい場合は引数に `-d` フラグを指定します：

```
$ docker-machine create -d virtualbox
Usage: docker-machine create [OPTIONS] [arg...]

Create a machine

Options:
   --virtualbox-boot2docker-url                                                                         The URL of the boot2docker image. Defaults to the latest available version [$VIRTUALBOX_BOOT2DOCKER_URL]
   --virtualbox-cpu-count "1"                                                                           number of CPUs for the machine (-1 to use the number of CPUs available) [$VIRTUALBOX_CPU_COUNT]
   --virtualbox-disk-size "20000"                                                                       Size of disk for host in MB [$VIRTUALBOX_DISK_SIZE]
   --virtualbox-import-boot2docker-vm                                                                   The name of a Boot2Docker VM to import
   --virtualbox-memory "1024"                                                                           Size of memory for host in MB [$VIRTUALBOX_MEMORY_SIZE]
   --driver, -d "none"                                                                                  Driver to create machine with. Available drivers: amazonec2, azure, digitalocean, exoscale, google, none, openstack, rackspace, softlayer, virtualbox, vmwarefusion, vmwarevcloudair, vmwarevsphere
   --engine-opt [--engine-opt option --engine-opt option]                                               Specify arbitrary opts to include with the created engine in the form opt=value
   --engine-insecure-registry [--engine-insecure-registry option --engine-insecure-registry option]     Specify insecure registries to allow with the created engine
   --engine-registry-mirror [--engine-registry-mirror option --engine-registry-mirror option]           Specify registry mirrors to use
   --engine-label [--engine-label option --engine-label option]                                         Specify labels for the created engine
   --engine-storage-driver "aufs"                                                                       Specify a storage driver to use with the engine
   --swarm                                                                                              Configure Machine with Swarm
   --swarm-master                                                                                       Configure Machine to be a Swarm master
   --swarm-discovery                                                                                    Discovery service to use with Swarm
   --swarm-host "tcp://0.0.0.0:3376"                                                                    ip/socket to listen on for Swarm master
   --swarm-addr        
```

#### Docker engine 作成時に特定のオプションを指定する

Docker Machine による Docker のインストールや設定には、適切なデフォルト値が用いられます。例えば、これによって TLS ベースの暗号化 TCP 通信の設定や、デフォルトの AUFS[ ストレージ・ドライバ](https://docs.docker.com/reference/commandline/cli/#daemon-storage-driver-option)を変更できます。

Docker Engine（ 別名、Docker デーモンのことです）を作成するとき、ユーザ自身でオプションを設定したい場合があるでしょう。例えば、自分自身で稼働している[レジストリ](https://docs.docker.com/registry/) を指定するには、デーモンで `--insecure-registry` フラグを使います。Docker Machine の `create` コマンドには、`--engine` で始まる様々なフラグをサポートしています。

Docker Machine は単純に設定された値をデーモンに送るだけであり、セットアップにあたって何らかの"依存関係"を解決するものではないことにご注意ください。例えば、ストレージ・ドライバに `btrfs` を使ったデーモンを作るには、自身で適切な依存関係のあるものをインストール、この場合は BTRFS ファイルシステムを作るなどします。

以下は実行例です：

```
$ docker-machine create -d virtualbox \
    --engine-label foo=bar \
    --engine-label spam=eggs \
    --engine-storage-driver devicemapper \
    --engine-insecure-registry registry.myco.com \
    foobarmachine
```

これはローカルの VirtualBox で動作する仮想マシンを作成するもので、ストレージのバックエンドに `devicemapper` を使い、`foo=bar` と `spam=eggs` というキー・バリュのペアをエンジンにラベルします。さらに、`registry.myco.com` という、ローカルの安全ではないレジストリ（insecure registry）からのイメージの取得・送信を可能とします。この詳細情報は `docker info` の結果からも確認できます。

```
$ eval $(docker-machine env foobarmachine)
$ docker version
Containers: 0
Images: 0
Storage Driver: devicemapper
...
Name: foobarmachine
...
Labels:
 foo=bar
 spam=eggs
 provider=virtualbox 
```

サポートしているフラグは次のようなものです：

* `--engine-insecure-registry`：[安全ではないレジストリ]
* `--engine-registry-mirror`：[レジストリのミラー](https://docs.docker.com/machine/https://github.com/docker/docker/blob/master/docs/sources/articles/registry_mirror)を指定
* `--engine-label`：Engine 作成時に[ラベル](https://docs.docker.com/userguide/labels-custom-metadata/#daemon-labels)を指定
* `--engine-storage-driver`：Engine が使う[ストレージ・ドライバ](https://docs.docker.com/reference/commandline/cli/#daemon-storage-driver-option)を指定

Engine が複数回利用可能なフラグをサポートしている場合（`--label` 等）、Docker Machine でも指定できます。

デーモンが直接サポートしているフラグのサブセットがある場合、Docker Machine でも同様に追加フラグをサポートします。`--engine-opt` は利用可能な任意のオプションを指定するもので `--engine-opt flagname=value` の構文です。例えば、全てのコンテナ向けの DNS サーバを `8.8.8.8` にデーモン側で指定したり、あるいは `syslog` [ログ・ドライバ](https://docs.docker.com/reference/run/#logging-drivers-log-driver) を指定するには、次のように create コマンドを指定します。

```
$ docker-machine create -d virtualbox \
    --engine-opt dns=8.8.8.8 \
    --engine-opt log-driver=syslog \
    gdns
```

#### Docker Swarm オプションで作成するマシンのオプション指定

先ほどの Docker Engine に対して設定可能なオプションを追加できるだけでなく、Machine を使って Swarm マスタの設定もできます。`--swarm-strategy` フラグを使うと、Docker Swarm が使うべき特定の[スケジューリング・ストラテジ](https://docs.docker.com/swarm/scheduler/strategy/)（Machine のデフォルトは `spread` ストラテジです）を指定できます。あるいは `--swarm-opt` オプションを使って、先ほどの `--engine-opt` オプションと同様に一般的な設定を行えますが、`swarm manage` コマンドなど基本的なコマンドの一部は除きます（マスタ・ノードの起動などの指定）。この設定機能は、ハートビート間隔の調整や Swarm のオーバーコミット・リソースの設定など上級者向けです。

それぞれのオプションがどのように動作するのか理解していなければ、何も指定しないのが望ましいでしょう。Docker Machine は使用時に迷わないよう、適切なデフォルト値を使います。

作成例：

```
$ docker-machine create -d virtualbox \
    --swarm \
    --swarm-master \
    --swarm-discovery token://<token> \
    --swarm-strategy binpack \
    --swarm-opt heartbeat=5 \
    upbeat
```

これを実行すると Swarm のスケジューリング・ストラテジを "binpack" に設定し（展開先のホストが増えないように、コンテナを集める方法です）、"heartbeat" 間隔を５秒にします。

### config

Docker client で対象マシンの設定を表示します。

```
$ docker-machine config dev
--tlsverify --tlscacert="/Users/ehazlett/.docker/machines/dev/ca.pem" --tlscert="/Users/ehazlett/.docker/machines/dev/cert.pem" --tlskey="/Users/ehazlett/.docker/machines/dev/key.pem" -H tcp://192.168.99.103:2376
```

### env

`docker`コマンド が適切なマシン上で実行されるように設定する環境変数を表示します。

`docker-machine env machinename` を実行するとサブシェルで実行できる `export` コマンドが表示されます。`docker-machine env -u` は `unset` と表示、逆に無効化します。

```
$ env | grep DOCKER
$ eval "$(docker-machine env dev)"
$ env | grep DOCKER
DOCKER_HOST=tcp://192.168.99.101:2376
DOCKER_CERT_PATH=/Users/nathanleclaire/.docker/machines/.client
DOCKER_TLS_VERIFY=1
DOCKER_MACHINE_NAME=dev
$ # docker コマンドを実行すると、対象ホスト上で実行されます
$ eval "$(docker-machine env -u)"
$ env | grep DOCKER
$ # 環境変数は削除されます
```

先の例は `bash` や `zsh` といったシェルの出力です（何のシェルを使っているか分からない場合、多くの場合 `bash`  を使用しています）。しかし、Docker Machine がサポートしているのは、そのシェルだけではありません。

`fish` を使っている場合は、`SHELL` 環境変数で `fish` がどこにあるかパスを確認できると、`docker-machine env name` によって、`fish` が必要とする形式で表示されます。

```
set -x DOCKER_TLS_VERIFY 1;
set -x DOCKER_CERT_PATH "/Users/nathanleclaire/.docker/machine/machines/overlay";
set -x DOCKER_HOST tcp://192.168.99.102:2376;
set -x DOCKER_MACHINE_NAME overlay
# Run this command to configure your shell:
# eval "$(docker-machine env overlay)"
```

Windows 上で Powershell や `cmd.exe` を使っている場合は、`docker-machine env` コマンドはどのようなシェルか自動的に検出できません。その代わり、`--shell` フラグを `docker-machine env` コマンドで使うことで適切なオプションを表示します。

Powershell の場合：

```
$ docker-machine.exe env --shell powershell dev
$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://192.168.99.101:2376"
$Env:DOCKER_CERT_PATH = "C:\Users\captain\.docker\machine\machines\dev"
$Env:DOCKER_MACHINE_NAME = "dev"
# Run this command to configure your shell:
# docker-machine.exe env --shell=powershell | Invoke-Expression
```

`cmd.exe` の場合：

```
set DOCKER_TLS_VERIFY=1
set DOCKER_HOST=tcp://192.168.99.101:2376
set DOCKER_CERT_PATH=C:\Users\captain\.docker\machine\machines\dev
set DOCKER_MACHINE_NAME=dev
# Run this command to configure your shell: copy and paste the above values into your command prompt
```

### inspect

```
使い方: docker-machine inspect [OPTIONS] [arg...]

マシンに関する調査情報を表示

説明:
   引数はマシン名です。

オプション:
   --format, -f 	go template のフォーマットを指定
```

デフォルトでは、マシンの情報を JSON 形式で出力します。書式を指定すると、各々の結果を表示します。

書式の詳細については、Go 言語の [text/template](http://golang.org/pkg/text/template/) パッケージに詳細が記述されています。

'text/template' 形式のほかに、`json` や `prettyjson` という JSON 形式の書式も使えます。

#### 例

##### マシンの全ての詳細を表示：

これは `inspect` の標準的な使い方です。

```
$ docker-machine inspect dev
{
    "DriverName": "virtualbox",
    "Driver": {
        "MachineName": "docker-host-128be8d287b2028316c0ad5714b90bcfc11f998056f2f790f7c1f43f3d1e6eda",
        "SSHPort": 55834,
        "Memory": 1024,
        "DiskSize": 20000,
        "Boot2DockerURL": "",
        "IPAddress": "192.168.5.99"
    },
    ...
}
```

##### マシンの IP アドレスを取得

多くの場合、JSON のフィールドを次のように取得するでしょう。

```
$ docker-machine inspect --format='{{.Driver.IPAddress}}' dev
192.168.5.99
```

##### フォーマットの詳細

JSON 形式のサブセット情報を取得したい場合は、テンプレートの `json` 機能が使えます。

```
$ docker-machine inspect --format='{{json .Driver}}' dev-fusion
{"Boot2DockerURL":"","CPUS":8,"CPUs":8,"CaCertPath":"/Users/hairyhenderson/.docker/machine/certs/ca.pem","DiskSize":20000,"IPAddress":"172.16.62.129","ISO":"/Users/hairyhenderson/.docker/machine/machines/dev-fusion/boot2docker-1.5.0-GH747.iso","MachineName":"dev-fusion","Memory":1024,"PrivateKeyPath":"/Users/hairyhenderson/.docker/machine/certs/ca-key.pem","SSHPort":22,"SSHUser":"docker","SwarmDiscovery":"","SwarmHost":"tcp://0.0.0.0:3376","SwarmMaster":false}
```

使いやすいのですが、人間にとっては読み辛いものです。そこで、`prettyjson` を使います。

```
$ docker-machine inspect --format='{{prettyjson .Driver}}' dev-fusion
{
    "Boot2DockerURL": "",
    "CPUS": 8,
    "CPUs": 8,
    "CaCertPath": "/Users/hairyhenderson/.docker/machine/certs/ca.pem",
    "DiskSize": 20000,
    "IPAddress": "172.16.62.129",
    "ISO": "/Users/hairyhenderson/.docker/machine/machines/dev-fusion/boot2docker-1.5.0-GH747.iso",
    "MachineName": "dev-fusion",
    "Memory": 1024,
    "PrivateKeyPath": "/Users/hairyhenderson/.docker/machine/certs/ca-key.pem",
    "SSHPort": 22,
    "SSHUser": "docker",
    "SwarmDiscovery": "",
    "SwarmHost": "tcp://0.0.0.0:3376",
    "SwarmMaster": false
}
```

### help

ヘルプ文字列を表示します。

### ip

マシンの IP アドレスを表示します。

```
$ docker-machine ip dev
192.168.99.104
$ docker-machine ip dev dev2
192.168.99.104
192.168.99.105
```

### kill

マシンを kill（突発的に強制停止）します。

```
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL
dev    *        virtualbox   Running   tcp://192.168.99.104:2376
$ docker-machine kill dev
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL
dev    *        virtualbox   Stopped
```

### ls

```
使い方: docker-machine ls [オプション] [引数...]

マシン一覧の表示

オプション:

   --quiet, -q					quiet mode の有効化
   --filter [--filter option --filter option]	指定した形式で出力をフィルタする
```

#### フィルタリング

フィルタリング・フラグ（`-f` や `--filter`） の書式は `key=value` のペアです。複数のフィルタをしたいときは、複数回フラグを指定します（例：`--filter "foo=bar" --filter "bif=baz"`）。

現在サポートしているフィルタは次の通りです：

 * ドライバ（ドライバ名）
 * swarm （swarm マスタ名）
 * 状態 (`Running|Paused|Saved|Stopped|Stopping|Starting|Error`)

#### 例

```
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL
dev             virtualbox   Stopped
foo0            virtualbox   Running   tcp://192.168.99.105:2376
foo1            virtualbox   Running   tcp://192.168.99.106:2376
foo2   *        virtualbox   Running   tcp://192.168.99.107:2376

,,,
$ docker-machine ls --filter driver=virtualbox --filter state=Stopped
NAME   ACTIVE   DRIVER       STATE     URL   SWARM
dev             virtualbox   Stopped
```

### regenerate-certs

TLS 証明書を再作成し、マシンのものを新しいものへ更新します。

```
$ docker-machine regenerate-certs dev
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
```

### restart

マシンを再起動します。典型的なものは `docker-machine stop; docker-machine start` です。

```
$ docker-machine restart dev
Waiting for VM to start...
```

### rm

マシンを削除します。これにより、クラウド・プロバイダや仮想環境の管理プラットフォーム上にあって、ローカルで参照しているものを削除します。

```
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL
foo0            virtualbox   Running   tcp://192.168.99.105:2376
foo1            virtualbox   Running   tcp://192.168.99.106:2376
$ docker-machine rm foo1
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL
foo0            virtualbox   Running   tcp://192.168.99.105:2376
```

### ssh

コマンドを実行するとマシンに SSH で入ります。

ログインには `docker-machine ssh machinename` と実行するだけです：

```
$ docker-machine ssh dev
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.4.0, build master : 69cf398 - Fri Dec 12 01:39:42 UTC 2014
docker@boot2docker:~$ ls /
Users/   dev/     home/    lib/     mnt/     proc/    run/     sys/     usr/
bin/     etc/     init     linuxrc  opt/     root/    sbin/    tmp      var/
```

また、`docker-machine ssh` コマンド実行時、通常の `ssh` プログラムの動作のように、リモート上で実行するコマンドを指定することもできます。

```
$ docker-machine ssh dev free
             total         used         free       shared      buffers
Mem:       1023556       183136       840420            0        30920
-/+ buffers:             152216       871340
Swap:      1212036            0      1212036
```

コマンドと同時に `df -h` のようにフラグの指定もできます。また、ターミネータ(`--`) を指定して `docker-machine` クライアントとの混同を避け、あくまでコマンドの実行を意図したものであると分かりやすくなります。

```
$ docker-machine ssh dev -- df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                  899.6M     85.9M    813.7M  10% /
tmpfs                   899.6M     85.9M    813.7M  10% /
tmpfs                   499.8M         0    499.8M   0% /dev/shm
/dev/sda1                18.2G     58.2M     17.2G   0% /mnt/sda1
cgroup                  499.8M         0    499.8M   0% /sys/fs/cgroup
/dev/sda1                18.2G     58.2M     17.2G   0%
/mnt/sda1/var/lib/docker/aufs
```

#### 異なる種類の SSH

Docker Machine が呼び出されると、伝統的な `ssh` バイナリがローカルにあるかどうか確認氏、必要があれば SSH コマンドの実行のために使われます。これはホスト作成時の手順の一部においても、直接処理されます。もし `ssh` バイナリがローカルに存在しなければ、デフォルトでは Go 言語の [crypto/ssh](https://godoc.org/golang.org/x/crypto/ssh) のネイティブな実装を使います。そのため、もし伝統的な UNIX ツールに対してアクセスできなくても、Windows 上で Docker Machine を使うような場合など、msysgit をインストールしなくても動作します。

多くの場合、この実装の詳細や Docker Machine が箱の中でどのように動作するか気にする必要はありません。しかしながら、意図的に Go 言語のネイティブ版を使いたい場合は、次のように環境変数をグルーバル・コマンドを通して指定できます。

```
$ docker-machine --native-ssh ssh dev
```

２つの手法の間には様々な振るまいがありますが、問題や矛盾するようなことがあれば、どうか教えてください。

### scp

ローカル・ホストからマシーン上へ、マシーンからマシーンへ、あるいはマシーンからローカルホストへのファイルのコピーに `scp` を使います。

引数での記法は `マシン名:/ファイル/への/パス` 形式で、ホストマシン上の場合はホスト名を指定せず、パスだけ記述します。

次の例を考えてみます：

```
$ cat foo.txt
cat: foo.txt: No such file or directory
$ docker-machine ssh dev pwd
/home/docker
$ docker-machine ssh dev 'echo A file created remotely! >foo.txt'
$ docker-machine scp dev:/home/docker/foo.txt .
foo.txt                                                           100%   28     0.0KB/s   00:00
$ cat foo.txt
A file created remotely!
```

デフォルトではファイルは再帰的にコピーします（ `scp` の `-r` フラグです ）。

この例ではファイルをマシンからマシンへコピーしていますが、ローカルホストのファイルシステムを通過します（ `scp` の `-3` フラグを使います ）。

### start

マシンを起動します。

```
$ docker-machine start dev
Starting VM...
```

### stop

マシンを通常停止します。

```
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL
dev    *        virtualbox   Running   tcp://192.168.99.104:2376
$ docker-machine stop dev
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL
dev    *        virtualbox   Stopped
```

### upgrade

マシンを最新版の Docker にバージョンアップします。もしマシンが Ubuntu を基本オペレーティング・システムとして使っている場合は、`lxc-docker` パッケージをアップグレードします（私達が推奨しているインストール方法です）。もしマシンが boot2docker を使っていれば、このコマンドによって最新の boot2docker ISO をダウンロードし、既存のマシン上の ISO を最新のものへ置き換えます。

```
$ docker-machine upgrade dev
Stopping machine to do the upgrade...
Upgrading machine dev...
Downloading latest boot2docker release to /home/username/.docker/machine/cache/boot2docker.iso...
Starting machine back up...
Waiting for VM to start...
```

メモ：もし調整した boot2docker ISO イメージを指定するには、`--virtualbox-boot2docker-url` を使うか、同等のフラグを使います。そうすることで、最新の "vanilla" boot2docker ISO を特定の ISO に置き換えます。

### url

ホストの URL を取得します。

```
$ docker-machine url dev
tcp://192.168.99.109:2376
```

## ドライバ

※訳注；多岐に渡るため省略。詳細はリンク先を参照。

### Amazon Web Services
* [ドキュメント](https://docs.docker.com/machine/#amazon-web-services)

### Digital Ocean
* [ドキュメント](https://docs.docker.com/machine/#amazon-web-services)

### exoscale
* [ドキュメント](https://docs.docker.com/machine/#exoscale)

### Generic
* [ドキュメント](https://docs.docker.com/machine/#generic)

### Google Compute Engine
* [ドキュメント](https://docs.docker.com/machine/#google-compute-engine)

### IBM SoftLayer
* [ドキュメント](https://docs.docker.com/machine/#ibm-softlayer)

### Microsoft Azure
* [ドキュメント](https://docs.docker.com/machine/#microsoft-azure)

### Microsoft Hyper-V
* [ドキュメント](https://docs.docker.com/machine/#microsoft-hyper-v)

### OpenStack
* [ドキュメント](https://docs.docker.com/machine/#openstack)

### Rackspace
* [ドキュメント](https://docs.docker.com/machine/#rackspace)

### Oracle VirtualBox
* [ドキュメント](https://docs.docker.com/machine/#oracle-virtualbox)

### VMware Fusion
* [ドキュメント](https://docs.docker.com/machine/#vmware-fusion)

### VMware vCloud Air
* [ドキュメント](https://docs.docker.com/machine/#vmware-vcloud-air)

### VMware vSphere
* [ドキュメント](https://docs.docker.com/machine/#vmware-vsphere)



## ベース OS の設定

Docker Machine のプロビジョニングシステムは、複数のベース・オペレーティング・システムをサポートしています。ローカルなプロバイダであれば VirtualBox、Fusion、Hyper-V などがありますが、デフォルトのベース・オペレーティング・システムは Boot2Docker です。クラウド・プロバイダでは、ベース・オペレーティング・システムはサポートされる最新の Ubuntu TLS です。


```
OS名            バージョン    メモ
Boot2Docker 	1.5+ 	      ローカルのデフォルト
Ubuntu 	        12.04+ 	      リモートのデフォルト
RancherOS       0.3+ 	
Debian 	        8.0+ 	      実験的
RedHat Enterprise Linux 7.0+  実験的
CentOS 	        7+            実験的
Fedora 	        21+ 	      実験的
```

リモートのプロバイダ毎に異なったベース・オペレーティング・システムを使うには、プロバイダで利用可能なイメージのフラグを指定します。例えば DigitalOcean で `debian-8-x64` イメージを使いたい場合は、次のようにします。

```
--digitalocean-image=debian-8-x64
```

プロバイダによってベース・イメージを変えたい場合、SSH ユーザの変更も必要です。例えば、EC2 上のデフォルトの Red Hat AMI の SSH ユーザは `ec2-user` なので、これは `--amazonec2-ssh-user ec2-user` のように指定する必要があります。

ｰｰｰｰ
Reference:
https://docs.docker.com/machine/