Windows10(pro)ではじめる git +  Docker 開発環境 


## 概要
Windows10勢いあるなと感じてPCを購入したので
docker+gitの開発環境を構築した。

以下やってみた
1. Windows端末でgitの操作
2. Windows端末でDockerを立ち上げ
3. Docker内でWebアプリケーション(sinatra)立ち上げ
4. コード管理は以下のようにする
インフラ環境はDockerfileに書いて、git管理
コードはwindows上でのお気に入りのテキストエディタで編集してgit管理



## 環境
OS: Windows10 pro
cpu: corei-5
メモリ: 8GB


## Windows開発環境のイメージ
* Linuxでの開発が多いのでWindowsでも同じようにLinux環境がほしい
* Windowsに直接ruby入れたりできるけどWindowsの環境自体は汚したくないな
* virtualbox入れてディスク10GBぐらい確保して立ち上げ必要だろうな
    * 起動が重くて容量食う印象

最近Macばっか触っていたのでこんなイメージだったが、Dockerの高速、軽量な使い捨て環境が解決！



## Dockerをインストール
Dockerについては
http://paiza.hatenablog.com/entry/docker_intro
がわかりやすかったです。

インストールについては
https://docs.docker.com/docker-for-windows/ 
を参照。

Windows10 proだとHyper-V上で動く。VitrualBox不要。
`
Docker for Windows requires 64bit Windows 10 Pro, Enterprise and Education (1511 November update, Build 10586 or later) and Microsoft Hyper-V
`
それ以外は[Docker Toolbox](https://docs.docker.com/toolbox/overview/)を使う。Virtual Box上で動く。

チュートリアルどおりubuntuのbash環境は以下ですぐ立ち上がる、すごい。

```bash
$ winpty docker run -it ubuntu bash
Git Bashで実行の際は、winptyのprefixが必要だった
```

まだ立ち上げただけだがcpu, メモリほとんどかわらず高速、軽量。

余計なものを立ち上げない分VirtualBoxよりはかなり軽い印象。

ubuntuのイメージは126.4 MBで場所とらない。



## Gitをインストール
https://git-for-windows.github.io/ 
を参照

一緒にGit BashというBashエミュレーターがインストールされる。
鍵作成とかdockerコマンドとかvimとか使えるので便利。
他にもエミュレーターあるみたいだけど、とりあえずこれを使っている。


## Webアプリケーション立ち上げまで
コードは以下にまとめ
https://github.com/yoosato/docker-test

#### Dockerfileでinfrastructure as code
https://github.com/yoosato/docker-test/blob/master/Dockerfile

```bash
FROM ruby
MAINTAINER yoosato
RUN apt-get update && apt-get install -y curl lsof net-tools

RUN gem install bundler
EXPOSE 4567

COPY Gemfile* /tmp/
WORKDIR /tmp
RUN bundle install -j 5

ENV app /app
RUN mkdir $app
WORKDIR $app
ADD . $app

CMD ["bundle","exec","ruby","testapp.rb", "-o", "0.0.0.0"]
```

dockerイメージに対して変更していって手動コミットもできるが、
インフラ環境もコード管理できるDockerfileにまとめていく。

今回は、sinatraを入れてみるのでFrom rubyとして、Docker Hubのものを使う。


#### sinatraの用意
http://type.jp/s/itac/article5.html を参考に簡単に用意。

```rb
require 'sinatra'
require 'sinatra/reloader'

get '/' do
  "Hello World!"
end
```


#### GemはbundleでGemfile管理
Gemfileをgitに用意して、Dockerfile内でbundleインストールしましょう。

```rb
source 'https://rubygems.org'
gem 'sinatra'
gem 'sinatra-reloader'
```

bundle installのResolving dependenciesですごく時間かかる。。
ので以下を参考に書き換えたらキャッシュしてくれて2回目以降早くなった。
https://medium.com/@fbzga/how-to-cache-bundle-install-with-docker-7bed453a5800#.tbjpd1lw3

#### コードをDockerイメージへ受け渡す方法
* DockerfileでCOPYする
* DockerfileでRUN git cloneでコードを取得

この２つの方法か？
今回ローカルにgit cloneしている前提でCOPYを使って書いてみる。


```bash
ENV app /app
RUN mkdir $app
WORKDIR $app
ADD . $app
```

Docker実行時に-vで受け渡す方法もある。こっちのほうがいちいちbuild不要でいいかも。
参考: https://github.com/ongaeshi/docker-sinatra-dev

windows上でお気に入りのテキストエディタを使って、git commitして、　　
dockerに渡す。

#### Dockerイメージをビルド
```bash
$ docker build -t testapp:01 .
```

-t <イメージ名前>:<tag>


### Docker起動
```bash
$ docker run -p 4567:4567 -d testapp:01
```

コンテナの中に入って確認したい場合は、docker execを使う。
参考: https://unicorn.limited/jp/item/347

```bash
$  winpty docker exec -it <id> bash
# ps auxww | grep testapp
# lsof -p <pid>
# curl "http://localhost:4567"
```

(rubyイメージではパッケージが最初から入っていないのでapt-get install curl lsof net-toolsしておく)


Windows端末 Edgeブラウザから
http://localhost:4567/
に~~アクセスできず。。~~
sinatraの外部アクセスの仕様変更の問題でした。
(Thanks Okayamasan&記事書いてくれた方)

http://qiita.com/u1_fukui/items/b86b21f6ed39f4c10d5d を参考に
DockerfileのCMDを以下のようにして再ビルド。

```bash
CMD ["bundle","exec","ruby","testapp.rb", "-o", "0.0.0.0"]
```

ブラウザから見れるようになった！！