Docker Machine をローカル VM で始めるには

VirtualBox 上で、docker-machine を使った Docker ホストの作成・使用・管理を見ていきましょう。

まず、 VirtualBox 4.3.28 がシステム上に正しくインストールしているのを確認します。

ここで docker-machine ls コマンドを実行すると、利用可能な全てのマシンを表示しますが、この時点ではまだホストを作成していません。

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL

docker-machine create コマンドを使い、1つ作成します。ここでは --driver フラグに virtualbox 文字列を与えます。最後の引数はマシン名を追加します。この例ではマシンに対して “dev” という名前を付けます。

このコマンドは軽量な Linux ディストリビューション( boot2docker )をダウンロードし、Docker デーモンをインストールします。それから 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-machine 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-machine ip コマンドで取得した IP アドレスで、サーバの 8000 ポートにアクセスします。以下は実行例です。

$ 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 が動く仮想環境を多く作成・管理するには、同様に docker-machine create を実行します。作成したマシンを全て表示するには docker-machine ls を実行します。

対象のホストを暫く使わないのであれば、 docker-machine stop で停止し、後から再び docker-machine start で開始できます。マシン名を引数として必ず指定してください。

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