Docker for MacでGoの実行環境を作る

## Docker for Macをインストール
[Docker for Mac](https://www.docker.com/docker-mac)
ここから最新のバージョンをダウンロードしてインストールする。
インストール後はターミナルからバージョン確認してみる。

### バージョン
```
$ docker --version
Docker version 17.12.0-ce, build c97c6d6

$ docker-compose --version
docker-compose version 1.18.0, build 8dd22a9

$ docker-machine --version
docker-machine version 0.13.0, build 9ba6da9
```
 
## Goのコンテナを用意

### docker-compose.ymlを作る
[Docker Hub](https://hub.docker.com/_/golang/) から最新のGolangイメージを選んで記述。
軽いのがいいのでalpine linuxを選択。
以下の内容でコンテナ起動はできるが、`tty: true` を指定しない場合は起動してすぐに`Exit 0`でコンテナが停止してしまう。

```docker-compose.yml
version: "3"

services:
  golang:
    image: golang:1.9.3-alpine3.7
    tty: true
```

### コンテナを起動
upしたらイメージ持ってきて起動までしてくれる。
psコマンドで`State`がUpになっていればOK!!

```
$ docker-compose up -d
Creating network "golangtest_default" with the default driver
Pulling golang (golang:1.9.3-alpine3.7)...
1.9.3-alpine3.7: Pulling from library/golang
ff3a5c916c92: Pull complete
f32d2ea73378: Pull complete
1106a361a438: Pull complete
1cb2a7f46753: Pull complete
7188bdf7ba91: Pull complete
ea18811c70a0: Pull complete
Digest: sha256:2ccdba55ff3f76bde1cf282cb34a1669408ec34420081005eae85ab16252f182
Status: Downloaded newer image for golang:1.9.3-alpine3.7
Creating golangtest_golang_1 ... done

$ docker-compose ps
       Name           Command   State   Ports
---------------------------------------------
golangtest_golang_1   /bin/sh   Up
```

### コンテナの中に入ってみる
alpineなのでbashじゃなくてash

```
$ docker-compose exec golang ash
/go # go version
go version go1.9.3 linux/amd64
```

### コンテナのVolume設定
先程作った`docker-compose.yml`の設定だけだと自分のMacで修正したコードがコンテナには反映されないので`volumes`を追加。
:の左がホスト、右がコンテナのパスになっているので、`./` => `docker-compose.yml`と同じ階層のファイルがコンテナの`/go`にマウントされる。
volume先のディレクトリはコンテナに設定されている`GOPATH`の場所を指定します。
デフォルトは`/go`が設定されていますが、`environment`で好きなパスに変更可能。

```docker-compose.yml
version: "3"

services:
  golang:
    image: golang:1.9.3-alpine3.7
    tty: true
    volumes:
      - ./:/go
    environment:
      - "GOPATH=/go"
```

#### デフォルトのGOPATHを確認
見にくいけど `/go` が入っている

```
$ docker-compose exec golang ash
/go # echo $GOPATH
/go
```

#### volumes設定前のマウント先を確認
`docker-compose.yml`がない

```
$ docker-compose exec golang ash
/go # pwd
/go
/go # ls -la
total 16
drwxrwxrwx    4 root     root          4096 Jan 23 22:49 .
drwxr-xr-x    1 root     root          4096 Feb  5 14:24 ..
drwxrwxrwx    2 root     root          4096 Jan 23 22:49 bin
drwxrwxrwx    2 root     root          4096 Jan 23 22:49 src
```

#### コンテナを起動しなおす
```
$ docker-compose up -d
Recreating golangtest_golang_1 ... done 
```

#### volumes設定後のマウント先を確認
`docker-compose.yml`が現れたので正常にマウントされている

```
$ docker-compose exec golang ash
/go # pwd
/go
/go # ls -la
total 12
drwxr-xr-x    4 root     root           128 Feb  5 14:07 .
drwxr-xr-x    1 root     root          4096 Feb  5 14:26 ..
-rw-r--r--    1 root     root           148 Feb  5 14:26 docker-compose.yml
```


## 適当にGoのコードを動かす
`docker-compose.yml`と同じ階層に`main.go`を作成

```main.go
package main

import "fmt"

func main() {
	fmt.Println("ハローワールド!!")
}
```

### コンテナ上で動かす
ハローワールド!!
とりあえず簡単にgoが動く環境ができた!!

```
$ docker-compose exec golang ash
/go # pwd
/go
/go # ls -la
total 12
drwxr-xr-x    4 root     root           128 Feb  5 14:07 .
drwxr-xr-x    1 root     root          4096 Feb  5 14:26 ..
-rw-r--r--    1 root     root           148 Feb  5 14:26 docker-compose.yml
-rw-r--r--    1 root     root            84 Feb  5 14:08 main.go
/go # go run main.go 
ハローワールド!!
```