概要
Windows10勢いあるなと感じてPCを購入したので
docker+gitの開発環境を構築した。
以下やってみた
- Windows端末でgitの操作
- Windows端末でDockerを立ち上げ
- Docker内でWebアプリケーション(sinatra)立ち上げ
- コード管理は以下のようにする
インフラ環境は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を使う。Virtual Box上で動く。
チュートリアルどおりubuntuの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
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 を参考に簡単に用意。
require 'sinatra'
require 'sinatra/reloader'
get '/' do
"Hello World!"
end
GemはbundleでGemfile管理
Gemfileをgitに用意して、Dockerfile内でbundleインストールしましょう。
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でコードを取得
この2つの方法か?
今回ローカルにgit cloneしている前提でCOPYを使って書いてみる。
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イメージをビルド
$ docker build -t testapp:01 .
-t <イメージ名前>:
Docker起動
$ docker run -p 4567:4567 -d testapp:01
コンテナの中に入って確認したい場合は、docker execを使う。
参考: https://unicorn.limited/jp/item/347
$ 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を以下のようにして再ビルド。
CMD ["bundle","exec","ruby","testapp.rb", "-o", "0.0.0.0"]
ブラウザから見れるようになった!!