周回遅れのDocker 1: Docker Toolbox を使って Docker を使えるようにする


## 2015-08-17 追記

Docker 1.8 と共に Docker Toolbox がリリースされ、OSX, Windows 上で Docker を利用する際にはこれを利用する方がより楽＆共通的になったので、Homebrew による導入手順から移行＆若干の説明文の変更を行いました。

----


## はじめに

いい加減、Docker の使用方法を最初から学習しつつ、ある程度有効活用できるようにする。まずはプライベートな環境や用途のあれこれを Docker ベースで考えて利用可能にするのが目標。

## ローカルマシンへ Docker 環境を作る

Docker 公式サイトにて、Docker 稼働環境を１からすべて用意してくれる [Docker Toolbox](https://www.docker.com/toolbox) というアプリケーションがあるので、これをローカルマシンへインストールする。

現在のところ Docker Toolbox には次のようなソフトウェアが梱包されている。

* Docker (Docker クライアント)
* Docker Machine (Docker Engine が稼働するホストを作ってくれる)
* Docker Compose (定義ファイルに基づく Docker イメージ作成 & 稼働, OSX のみ)
* Docker Kitematic (Docker 管理 GUI アプリケーション)
* VirtualBox (仮想マシン)

インストールが終わると「Quick start」と題したヒントなどが掲載されるが、ひとまずこれは置いておいて CLI コマンドで進めてみる。


## ファーストステップ

`docker-machine create` コマンドで virtualbox 環境に対してホストを作成する。

```bash
$ docker-machine create -d virtualbox dev

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
```
 virtualbox をみるとホストが起動していることが確認できる。


docker-machine で作られたマシン (docker ホスト) を確認。仮にいくつかのホストを create しているならば、ここに複数並ぶはず。

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

`docker-machine config` コマンドを使うと、docker のホストオプションのための値を出力してくれる。docker 実行時には、これを利用する。

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

ひとまず docker を実行してみる。 (echo hello world)

```bash
$ docker $(docker-machine config dev) run busybox echo hello world

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
cf2616975b4a: Pull complete
6ce2e90b0bc7: Pull complete
8c2e06607696: Pull complete
Digest: sha256:df9e13f36d2d5b30c16bfbf2a6110c45ebed0bfa1ea42d357651bc6c736d5322
Status: Downloaded newer image for busybox:latest
hello world
```


Docker ホスト環境変数の登録と削除。

```bash
$ eval `docker-machine env dev`
$ eval `docker-machine env dev -u`
```


docker-machine による dokcer ホストの起動と停止。

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

docker-machine による docker ホストへの ssh.

```bash
$ docker-machine ssh dev
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker@dev:~$
```

`docker-machine inspect` コマンドで docker ホスト情報を確認。 
下半分の内容はまだよく分からないが、[docker-machine 0.3](https://github.com/docker/machine/releases) で新たに入った Features の初期値などと思われる。


```bash
$ docker-machine inspect dev
```

```json:inspect
{
    "ConfigVersion": 1,
    "Driver": {
        "IPAddress": "192.168.99.100",
        "SSHUser": "docker",
        "SSHPort": 50291,
        "MachineName": "dev",
        "CaCertPath": "/Users/kumakura/.docker/machine/certs/ca.pem",
        "PrivateKeyPath": "/Users/kumakura/.docker/machine/certs/ca-key.pem",
        "SwarmMaster": false,
        "SwarmHost": "tcp://0.0.0.0:3376",
        "SwarmDiscovery": "",
        "CPU": 1,
        "Memory": 1024,
        "DiskSize": 20000,
        "Boot2DockerURL": "",
        "Boot2DockerImportVM": "",
        "HostOnlyCIDR": "192.168.99.1/24"
    },
    "DriverName": "virtualbox",
    "HostOptions": {
        "Driver": "",
        "Memory": 0,
        "Disk": 0,
        "EngineOptions": {
            "ArbitraryFlags": [],
            "Dns": null,
            "GraphDir": "",
            "Env": [],
            "Ipv6": false,
            "InsecureRegistry": [],
            "Labels": [],
            "LogLevel": "",
            "StorageDriver": "",
            "SelinuxEnabled": false,
            "TlsCaCert": "",
            "TlsCert": "",
            "TlsKey": "",
            "TlsVerify": true,
            "RegistryMirror": [],
            "InstallURL": "https://get.docker.com"
        },
        "SwarmOptions": {
            "IsSwarm": false,
            "Address": "",
            "Discovery": "",
            "Master": false,
            "Host": "tcp://0.0.0.0:3376",
            "Image": "swarm:latest",
            "Strategy": "spread",
            "Heartbeat": 0,
            "Overcommit": 0,
            "TlsCaCert": "",
            "TlsCert": "",
            "TlsKey": "",
            "TlsVerify": false,
            "ArbitraryFlags": []
        },
        "AuthOptions": {
            "StorePath": "",
            "CaCertPath": "/Users/kumakura/.docker/machine/certs/ca.pem",
            "CaCertRemotePath": "",
            "ServerCertPath": "/Users/kumakura/.docker/machine/machines/dev/server.pem",
            "ServerKeyPath": "/Users/kumakura/.docker/machine/machines/dev/server-key.pem",
            "ClientKeyPath": "/Users/kumakura/.docker/machine/certs/key.pem",
            "ServerCertRemotePath": "",
            "ServerKeyRemotePath": "",
            "PrivateKeyPath": "/Users/kumakura/.docker/machine/certs/ca-key.pem",
            "ClientCertPath": "/Users/kumakura/.docker/machine/certs/cert.pem"
        }
    },
    "StorePath": "/Users/kumakura/.docker/machine/machines/dev"
}
```


`docker-machine upgrade` コマンドで docker ホストの更新が行える。これは大変楽で嬉しい。

```bash:upgrade
$ docker-machine upgrade dev

Stopping machine to do the upgrade...
Upgrading machine dev...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.8.1/boot2docker.iso to /Users/kumakura/.docker/machine/cache/boot2docker.iso...
Starting machine back up...
Starting VM...
```