create

マシンを作成します。どのプロバイダ(VirtualBox、DigitalOcean、AWS等)でマシンを作成するかを --driver フラグで指定します。さらに、引数で作成するマシンの名前も指定します。

$ 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 create コマンドには全てのドライバで適用できる共通のフラグがあります。主に、マシンのプロビジョニング手順における挙動を制御するもので(Docker Swarm コンテナの作成も含みます)、利用者がカスタマイズできます。

$ docker-machine create
Docker Machine Version: 0.5.0 (45e3688)
Usage: docker-machine create [OPTIONS] [arg...]

Create a machine.

Run 'docker-machine create --driver name' to include the create flags for that driver in the help text.

   --driver, -d "none"                                                                                  Driver to create machine with.
   --engine-install-url "https://get.docker.com"                                                        Custom URL to use for engine installation [$MACHINE_DOCKER_INSTALL_URL]
   --engine-opt [--engine-opt option --engine-opt option]                                               Specify arbitrary flags to include with the created engine in the form flag=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                                                                              Specify a storage driver to use with the engine
   --engine-env [--engine-env option --engine-env option]                                               Specify environment variables to set in the engine
   --swarm                                                                                              Configure Machine with Swarm
   --swarm-image "swarm:latest"                                                                         Specify Docker image to use for Swarm [$MACHINE_SWARM_IMAGE]
   --swarm-master                                                                                       Configure Machine to be a Swarm master
   --swarm-discovery                                                                                    Discovery service to use with Swarm
   --swarm-strategy "spread"                                                                            Define a default scheduling strategy for Swarm
   --swarm-opt [--swarm-opt option --swarm-opt option]                                                  Define arbitrary flags for swarm
   --swarm-host "tcp://0.0.0.0:3376"                                                                    ip/socket to listen on for Swarm master
   --swarm-addr

さらに、Machine は各プラグイン・コードに含むフラグも受け付けることができ、これをドライバのフラグで指定できます。これにより、利用者は作成するマシン向けプロバイダ固有のパラメータをカスタマイズできます。例えば、容量( --amazonec2-instance-type m1.medium )や地理的なリージョン( --amazonec2-region us-west-1 )などです。

プロバイダ固有のフラグを確認するには create ヘルプ・テキストを表示するときに --driver を単純に指定するだけです。

$ docker-machine create --driver virtualbox --help
Usage: docker-machine create [OPTIONS] [arg...]

Create a machine.

Run 'docker-machine create --driver name' to include the create flags for that driver in the help text.

Options:

   --driver, -d "none"                                                                                  Driver to create machine with.
   --engine-env [--engine-env option --engine-env option]                                               Specify environment variables to set in the engine
   --engine-insecure-registry [--engine-insecure-registry option --engine-insecure-registry option]     Specify insecure registries to allow with the created engine
   --engine-install-url "https://get.docker.com"                                                        Custom URL to use for engine installation [$MACHINE_DOCKER_INSTALL_URL]
   --engine-label [--engine-label option --engine-label option]                                         Specify labels for the created engine
   --engine-opt [--engine-opt option --engine-opt option]                                               Specify arbitrary flags to include with the created engine in the form flag=value
   --engine-registry-mirror [--engine-registry-mirror option --engine-registry-mirror option]           Specify registry mirrors to use
   --engine-storage-driver                                                                              Specify a storage driver to use with the engine
   --swarm                                                                                              Configure Machine with Swarm
   --swarm-addr                                                                                         addr to advertise for Swarm (default: detect and use the machine IP)
   --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-image "swarm:latest"                                                                         Specify Docker image to use for Swarm [$MACHINE_SWARM_IMAGE]
   --swarm-master                                                                                       Configure Machine to be a Swarm master
   --swarm-opt [--swarm-opt option --swarm-opt option]                                                  Define arbitrary flags for swarm
   --swarm-strategy "spread"                                                                            Define a default scheduling strategy for Swarm
   --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-host-dns-resolver                                                                       Use the host DNS resolver [$VIRTUALBOX_HOST_DNS_RESOLVER]
   --virtualbox-dns-proxy                                                                               Proxy all DNS requests to the host [$VIRTUALBOX_DNS_PROXY]
   --virtualbox-hostonly-cidr "192.168.99.1/24"                                                         Specify the Host Only CIDR [$VIRTUALBOX_HOSTONLY_CIDR]
   --virtualbox-hostonly-nicpromisc "deny"                                                              Specify the Host Only Network Adapter Promiscuous Mode [$VIRTUALBOX_HOSTONLY_NIC_PROMISC]
   --virtualbox-hostonly-nictype "82540EM"                                                              Specify the Host Only Network Adapter Type [$VIRTUALBOX_HOSTONLY_NIC_TYPE]
   --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]
   --virtualbox-no-share

環境変数を使ってもフラグと同様の指定ができるので、覚えておいてください(列の左側にあります)。環境変数は docker-machine create の実行時に読み込まれ、Docker machine はフラグのデフォルト値を上書きします。

Docker エンジン作成用のオプションを指定

作成時の手順において、Docker Machine は Docker をインストールし、適切な初期設定をします。たとえば、外の世界から TLS をベースとした暗号化 TCP を通して通信できるようにし、ストレージ・ドライバ が利用可能であれば AUFS を設定します。

Docker エンジン(あるいは Docker デーモン )に対して、利用者は自分自身でオプションを設定すべきケースが複数あります。例えば、自分たちで実行している レジストリ に接続するには、デーモンに対して --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 overlay \
    --engine-insecure-registry registry.myco.com \
    foobarmachine

これはローカルの VirtualBox に仮想マシンを作成するにあたり、ストレージのバックエンドには overlay を使用し、エンジンのラベルとしてキーバリュー・ペアの foo=barspam=eggs を指定します。さらに、 registry.myco.com にある非安全なレジストリへのイメージ送信・取得を許可します。詳細情報は docker info の出力結果から確認できます。

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

ここでは次のフラグが使えます。

エンジンは複数回のラベル指定( --label を使用)をサポートしており、Docker Machine によって設定できます。

デーモンのフラグを直接指定できるのに加え、Docker Machine は --engine-opt という追加フラグもサポートしています。これは --engine-opt flagname=value の形式で、特別な属性を持つデーモンのオプション指定に使います。例えば、全てのコンテナが DNS サーバに 8.8.8.8 を使うようデーモンに指定したり、常に syslog ログ・ドライバ を使って実行させたりするには、次のように create コマンドを使います。

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

さらに、Docker Machine は --engine-env フラグをサポートしています。これは外部の環境変数を指定するものであり、エンジンに適用するには --engine-env name=value の形式で指定します。例えば、エンジンが example.com をプロキシ・サーバとして使うには、create コマンドで次のように実行します。

$ docker-machine create -d virtualbox \
    --engine-env HTTP_PROXY=http://example.com:8080 \
    --engine-env HTTPS_PROXY=https://example.com:8080 \
    --engine-env NO_PROXY=example2.com \
    proxbox

マシン作成時に Docker Swarm オプションを指定

先ほどの Docker Engine オプションの設定を指定できるだけではありません。Docker Machine を使えば、 Swarm マスタをどのように作成するかも指定できます。 --swarm-strategy フラグを使うと、Docker Swarm が使うべき スケジューリング・ストラテジ (デフォルトは spread ストラテジ )を指定できます。また前述した --engine-opt オプションで指定したように、 --swarm-opt オプションで一般的なオプションを設定できますが、違いは swarm manage コマンドに対するオプション(マスタ・ノードの起動時に使用)を指定するものです。これらの機能設定を使うことで、パワーユーザであれば heartbeat 間隔の調整や、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」間隔を5秒にします。

作成の事前確認

多くのドライバで、それぞれの場所で実際に作成可能どうか確認する必要があるでしょう(例:VirtualBox がインストールされているかや、指定する API 証明書が有効かどうか)。Docker Machine は「作成の事前確認」(pre-create check)をドライバごとに行えます。

事前確認が成功すると、Docker Machine は通常通り作成手順を進行します。事前確認に失敗すると、 Docker Machine のプロセスは終了コード 3 で終了します。つまり、ゼロ以外の終了コードを返す場合は、事前作成に失敗したのが分かります。