Docker Machine
Docker Machine 0.3.0 のドキュメントの参考日本語訳です。手許に翻訳したまま死蔵しておくのもアレなので、内容未保証の参考訳として公開します。
メモ:Machine は原点ではベータ版のため、ここにある記述は変わる場合があります。本番環境(プロダクション)での利用は推奨しません。
Docker Machine は自分のコンピュータ上やクラウド・プロバイダ上や自身のデータセンタ内で Docker ホストを作成します。サーバを作成し、Docker をインストールしたあと、Docker クライアントが通信できるように設定します。
Docker ホストを作成後は、管理用の多くのコマンドが使えるようになります:
- 起動、停止、再起動
- Docker のアップグレード
- Docker クライアントとホストが通信できる設定
ヘルプを得るには
Docker Machine は未だ初期段階であり活発に開発中です。もしヘルプが必要であれば、貢献するか、プロジェクト内で同様の考えを持っている方に話すなど、コミュニケーションのための数々のオープンなチャンネルを持っています。
- バグ報告や機能リクエストを送りたい場合:GitHub の issue tracker をお使いください。
- プロジェクトの人々とリアルタイムに会話したい場合:IRC の
#docker-machine
チャンネルに参加ください。 - コードやドキュメント更新に貢献したい場合:GitHub でプルリクエストをお送りください。
より詳しい情報やリソースに関しては、https://docs.docker.com/project/get-help/ を参照ください。
インストール
Docker Machine は Windows、OS X、Linux でサポートされており、単体で動作するバイナリをインストールできます。以下は様々なプラットフォームやアーキテクチャに対するバイナリのリンクです:
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 の使用を推奨します。これを使うことで、 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 中で Docker ホストを作成・使用・管理してみましょう。
まず VirtualBox 4.3.28 がシステム上にインストールされていることを確認ください。
docker-machine ls
コマンドを実行すると、利用可能なマシンすべてが表示されます。今は何も表示されませんが、後ほど作成後に表示されます。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL
ホストを作成するには、docker-machine create
コマンドを実行し、--driver
フラグで virtualbox
を指定します。引数の最後はマシン名を書きます。ここではマシン名を "dev" とします。
次のコマンドは、Docker デーモンがインストールずみの軽量な Linux ディストリビューション(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
コマンドのドキュメントを読み、自身のシェル上で環境変数を指定する方法を学んでください。
環境変数を設定することにより、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) をコンテナで次のように実行しているとします。
$ 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 ドライバ(digitalocean
という名前です)のデモを行いますが、他にも Amazon Web Services、Google Compute Engine、Microsoft Azure といった複数のプロバイダのドライバが利用可能です。
docker-machine create
フラグをこれらのプロバイダで使う時は、通常はアカウント認証情報( credentials ) を使います。必要となるフラグは、ドライバによって異なります。例えば、Digital Ocean のアクセス・トークンを使いたい場合は、--digitalocean-access-token
フラグを使います。
それでは、どのように動作するか見てみましょう。
アクセストークンは、次のように作成します。
- Digital Ocean の管理コンソールにアクセスし、ページ上方の "API" をクリックします。
- "Generate New Token"(新しいトークンの作成)をクリックします。
- トークンには適切な名前を付け(例:"machine")、”Write”(書き込み権限)のチェックボックスにチェックを入れ、"Generate Token"(トークン生成)をクリックします。
- 長い 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 クラスタのプロビジョンにも利用できます。これにより、あらゆるドライバとの通信は 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
これで2つのノードにまたがる 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 ストレージ・ドライバを変更できます。
Docker Engine( 別名、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 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
:レジストリのミラーを指定 -
--engine-label
:Engine 作成時にラベルを指定 -
--engine-storage-driver
:Engine が使うストレージ・ドライバを指定
Engine が複数回利用可能なフラグをサポートしている場合(--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 Swarm オプションで作成するマシンのオプション指定
先ほどの Docker Engine に対して設定可能なオプションを追加できるだけでなく、Machine を使って Swarm マスタの設定もできます。--swarm-strategy
フラグを使うと、Docker Swarm が使うべき特定のスケジューリング・ストラテジ(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" 間隔を5秒にします。
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 パッケージに詳細が記述されています。
'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 のネイティブな実装を使います。そのため、もし伝統的な UNIX ツールに対してアクセスできなくても、Windows 上で Docker Machine を使うような場合など、msysgit をインストールしなくても動作します。
多くの場合、この実装の詳細や Docker Machine が箱の中でどのように動作するか気にする必要はありません。しかしながら、意図的に Go 言語のネイティブ版を使いたい場合は、次のように環境変数をグルーバル・コマンドを通して指定できます。
$ docker-machine --native-ssh ssh dev
2つの手法の間には様々な振るまいがありますが、問題や矛盾するようなことがあれば、どうか教えてください。
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
Digital Ocean
exoscale
Generic
Google Compute Engine
IBM SoftLayer
Microsoft Azure
Microsoft Hyper-V
OpenStack
Rackspace
Oracle VirtualBox
VMware Fusion
VMware vCloud Air
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/