GCP(Google Compute Engine) に Docker Machine を置く


いくらなんでもMacBookでは重すぎるのでGoogle Compute Engineに置くことにした。

こちらを参考にしながら。 

- http://qiita.com/eielh/items/428e24022955b0be8616


# 事前準備
## gcloud の最新版のインストール

```
pip install gcloud
```

## gcloud にログイン
 
```
gcloud auth login
```

デフォルトだとブラウザが立ち上がってログインさせられる。

# Google Compute Engine で Nginxコンテナを動かしてみる

## docker-machine を作成する

作業用なら[プリエンプティプルインスタンスを利用する](http://googlecloudplatform-japan.blogspot.jp/2015/05/vm-3-vm.html)ことでだいぶ安くなるのと、間違って放置しても24時間で消えてくれるので `--google-preemptible` は指定するべき。あとタグとして `http-server` と `https-server` を指定しておくと、80と443が空くので便利です。(セキュリティには気をつけて)

```bash
$ docker-machine create -d google \
                        --google-project <PROJECT_NAME> \
                        --google-preemptible \
                        --google-tags 'http-server,https-server' \
                        --google-zone asia-east1-a \
                        --google-machine-type "g1-small" \
                        newton
```

でけた。

```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                          SWARM
default   -        virtualbox   Running   tcp://192.168.99.100:2376
newton    -        google       Running   tcp://XXX.XXX.XXX.XXX:2376
```

docker-machine を切り替える。

```bash
$ eval $(docker-machine env newton)

$ docker info
Containers: 1
Images: 12
Server Version: 1.9.0
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 14
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.19.0-28-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 1
Total Memory: 3.614 GiB
Name: newton
ID: GSHG:YOET:XXXX:EZ7T:CWX4:S4CC:6HZX:XXXX:OAPR:STQE:WKTH:LCBR
WARNING: No swap limit support
Labels:
 provider=google
```

## nginxを起動してみる

```bash
$ docker pull nginx
$ docker run -d -p 80:80 --name nginx nginx
c9ff75a9d98b9f0171e6bbcf7b475c45c8ecff980ca0e67264dc6bd895f85c65
```

素のまま作る。

## 動作確認

httpトラフィックを許可してあげればアクセスできるようになる。

```bash
$ curl http://$(docker-machine ip newton)
<!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,

....
```

よしよし。

### http ポートにアクセスできない場合

```bash
$ curl http://$(docker-machine ip newton)
curl: (7) Failed to connect to XXX.XXX.XXX.XXX port 80: Operation timed out
```

あれ・・・?

と思ったけどGCEのインスタンスはデフォルトでは外部からのhttpリクエストを受け付けない。上の手順で `--google-tag "http-server"` してればつながると思うんだけど、たまに間違ってたりするのでコンソールで見直そう。

![スクリーンショット 2015-11-07 19.38.01.png](https://qiita-image-store.s3.amazonaws.com/0/17911/fada7c82-24a2-07a5-5cda-09e52500c137.png "スクリーンショット 2015-11-07 19.38.01.png")

### Docker Machine で GCE のインスタンスを作ると登録される公開鍵の形式が変

DockerMachineさんが自動生成した認証情報をインスタンスに自動登録してくれているんだけど、公開鍵にユーザ名が書かれていないので、そのまま編集しようとすると保存できない。「無効なキーです」と怒られる。

<img width="359" alt="スクリーンショット 2015-11-08 9.37.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/17911/e66c8e72-275d-21eb-b7f9-243df85b8fad.png">

慌てず、末尾になんか適当な username を追加してあげよう。<username@example.com>とメールアドレス形式で書かれているが、適当な名前でよい。

## 使い終わったら

docker-machine コマンドで落とすと GCE側でインスタンスがちゃんと消えてくれる。

```
$ docker-machine rm newton
```