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

動作条件

  • システム上に正しくインストールするには、 最新バージョンの VirtualBox をインストールする必要があります。 Mac または Windows で Docker Machine のインストールに Docker Toolbox を使えば、VirtualBox を自動的にインストールします。
  • 1台目のマシンを Quickstart Terminal で作成したら、ターミナル上で default という名称を持つ環境が自動的に用意されます。この場合、以下の手順をそのまま読み進めても構いませんが、「default」以外の名前( staging や sandbox)で別のマシンの作成も可能です。

Machine を使って Docker コンテナを実行

Docker コンテナを実行するには、

  • 新しい Docker 仮想マシンを作成します(あるいは既存マシンを開始します)。
  • 環境変数を新しい仮想マシンに切り替えます。
  • docker クライアントを使い、コンテナの作成、読み込み、管理を行います。

Docker Machine で作成したマシンは、必要に応じて何度も再利用できます。マシンは VirtualBox 上の仮想マシンと同じ環境であり、どちらでも同じ設定が使われます。

以下の例で、マシンの作成・起動方法、 Docker コマンドの実行方法、コンテナの使い方を見ていきます。

マシンの作成

  1. コマンド・シェルやターミナル画面を開きます。

以下の例では Bash シェルを扱います。 C シェルのような他のシェルでは、いくつかのコマンドが動作しない可能性がありますので、ご注意ください。

  1. docker-machine ls を使い、利用可能なマシンの一覧を表示します。

以下の結果から、マシンがまだ1台も作成されていないことが分かります。

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
  1. マシンを作成します。

コマンド docker-machine create の実行時、 --driver フラグに virtualbox の文字列を指定します。そして、最後の引数がマシン名になります。これが初めてのマシンであれば、名前を default にしましょう。既に「default」という名前のマシンが存在している場合は、別の新しいマシン名を指定します。

$ docker-machine create --driver virtualbox default
Running pre-create checks...
Creating machine...
(staging) Copying /Users/ripley/.docker/machine/cache/boot2docker.iso to /Users/ripley/.docker/machine/machines/default/boot2docker.iso...
(staging) Creating VirtualBox VM...
(staging) Creating SSH key...
(staging) Starting the VM...
(staging) Waiting for an IP...
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 with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect Docker to this machine, run: docker-machine env default

このコマンドは Docker デーモンをインストールする軽量 Linux ディストリビューション( boot2docker )をダウンロードし、Docker を動かすための VirtualBox 仮想マシンを作成・起動します。

  1. 再び利用可能なマシン一覧表示したら、新しいマシンが出てきます。
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER   ERRORS
default   *        virtualbox   Running   tcp://192.168.99.187:2376           v1.9.1
  1. コマンドの環境変数を新しい仮想マシンに設定します。

コマンド docker-machine create を実行しても、そのまま新しいマシンを操作できないので注意が必要です。新しいマシンの操作には docker-machine env コマンドを使います。

$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://172.16.62.130:2376"
export DOCKER_CERT_PATH="/Users/<yourusername>/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval "$(docker-machine env default)"
  1. シェルを新しいマシンに接続します。
$ eval "$(docker-machine env default)"

注釈

fish や Powershell 、あるいは cmd.exe のような Windows シェルでは、先ほどのコマンドは実行できません。自分の使っているシェルで環境変数を有効にする方法は、 env コマンドのドキュメント をご覧ください。

このシェル上で指定した環境変数を使えば、クライアントは指定された TLS 設定を読み込みます。新しいシェルの起動時やマシン再起動時には、再度指定する必要があります。

あとはホスト上で Docker コマンドを実行できます。

Machine コマンドを使ってコンテナを実行

セットアップが完了したことを確認するため、docker run コマンドを使ってコンテナを起動しましょう。

  1. docker run コマンドを使い、 busybox イメージをダウンロードし、 簡単な echo コマンドを実行します。
$ 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
  1. ホストの IP アドレスを確認します。

Docker ホスト上でポート番号が利用可能な IP アドレスの確認は、 docker-machine ip コマンドを使います。

$ docker-machine ip default
192.168.99.100
  1. コンテナでウェブサーバ( https://www.nginx.com/ )を実行するため、次のコマンドを実行します。
$ docker run -d -p 8000:80 nginx

イメージの取得が完了したら、 docker-machine ip で確認した IP アドレス上のポート 8000 でサーバにアクセスできます。実行例:

$ curl $(docker-machine ip default):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-machine ls を使います。

マシンの起動と停止

ホストを使い終わり、しばらく使わないのであれば、 docker-machine stop を実行して停止できます。あとで起動したい場合は docker-machine start を実行します。

$ docker-machine stop default
$ docker-machine start default

マシンの名前を指定せずに操作するには

いくつかの docker-machine コマンドは、マシン名を明示しれなければ default という名称のマシン(が存在している場合)に対して処理を行います。そのため、 default ローカル仮想マシンは一般的なパターンとして、頻繁に利用できるでしょう。

実行例:

$ docker-machine stop
Stopping "default"....
Machine "default" was stopped.

$ docker-machine start
Starting "default"...
(default) Waiting for an IP...
Machine "default" was started.
Started machines may have new IP addresses.  You may need to re-run the `docker-machine env` command.

$ eval $(docker-machine env)

$ docker-machine ip
  192.168.99.100

コマンドは以下の形式でも利用可能です。

  • docker-machine config
  • docker-machine env
  • docker-machine inspect
  • docker-machine ip
  • docker-machine kill
  • docker-machine provision
  • docker-machine regenerate-certs
  • docker-machine restart
  • docker-machine ssh
  • docker-machine start
  • docker-machine status
  • docker-machine stop
  • docker-machine upgrade
  • docker-machine url

default 以外のマシンでは、常に特定のマシン名をコマンドの引数として明示する必要があります。

起動時にローカル・マシンの自動起動

シェルのセッションを開く度に、Docker クライアントが自動的に毎回設定された状態にするには、対象ユーザのシェル profile (例: ~/.bash_profile ファイル )に追記( eval $(docker-machine env default) )します。しかし、 default のマシンが起動されていなければコマンドは実行できません。そのような場合は、システム起動時に default マシンが自動的に起動するよう設定します。

以下の例は OS X 上での設定です。

~/Library/LaunchAgents 以下に com.docker.machine.default.plist ファイルを作成します。内容は次の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>EnvironmentVariables</key>
        <dict>
            <key>PATH</key>
            <string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
        </dict>
        <key>Label</key>
        <string>com.docker.machine.default</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/docker-machine</string>
            <string>start</string>
            <string>default</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

この中にある LaunchAgentdefault を書き換えれば、任意のマシン(群)を起動できます。