bio分野向けのDockerコンテナをつくる on MacOSX

# Dockerコンテナをつくる on MacOSX
- https://gist.github.com/hiromasaono/1187dd6a34ca221baada からの転載
- 2015.2.2-6  [国内版Biohackathon14.14](http://wiki.lifesciencedb.jp/mw/BH14.14) にて
- 再現性のあるサイエンスのための Docker/BioDevOps
  - [Docker野郎Dチーム](http://wiki.lifesciencedb.jp/mw/BH14.14/Docker) 　　

## bioな分野でDockerを使うとなにがいいのか
  - コンピュータによるデータ解析をだれでもどこでもコマンド一発で再現できるのが素敵
    - エヴァンジェリスト[@iNut](https://github.com/inutano)氏談
  - バイオインフォマティクスの参入障壁の一つであるマシン環境設定も考慮しなくていい
  - いままで環境構築に時間を費やしがちだった講習会などでも便利そう
    - マシンの環境設定だけで[丸1〜2日かかるケース(バイオインフォマティクス人材育成カリキュラム(次世代シークエンサ) | 速習コース)](http://www.iu.a.u-tokyo.ac.jp/~kadota/r_seq.html#bioinfo_ngs_sokushu_2014)もある

## 前提
 - MacOSX Yosemite
 - コマンドライン操作はそれなりにわかる人向け
 - GitHubは(ほぼ)初めて使う人向け
 - Dockerも初めて使う人向け
  
## 環境構築 
  
### Homebrew のインストール

`ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"`

  
### VirtualBox と Vagrant のインストール
`brew tap phinze/homebrew-cask`  
`brew install brew-cask -v`  
`brew cask install virtualbox -v`    
`brew cask install vagrant -v`  
  
### CoreOS のインストール
`git clone https://github.com/coreos/coreos-vagrant`  
`cd coreos-vagrant`  
`vagrant up && vagrant ssh`  
  
### CoreOSインストール完了の確認 
`coreos> docker run -it inutano/cmatrix`  
- マトリックスが流れればOK
  
### Portの設定
exit で coreosから抜けたあとに、  
~/coreos-vagrant/Vagrantfile を編集。  
最後から4行目 (行末にendが3回出てくるところの上) に  
`config.vm.network "forwarded_port", guest:443, host:4430`  
を追記して  
`vagrant reload && vagrant ssh`  
再起動する。  
  
### Port変更の確認
`coreos> docker run -d -p 443:8888 -e "PASSWORD=hoge" ipython/scipyserver`  
でscipyserverを起動して、  
ブラウザで　[https://localhost:4430/](https://localhost:4430/)　が開けばOK。  
  
### ファイルの共有設定
1. @coreos-vagrant 以下に share ディレクトリを作成 
`mkdir share`  
2. ~/coreos-vagrant/Vagrantfile を編集して  
`# Uncomment below to enable NFS for sharing the host machine into the coreos-vagrant VM.`  
の箇所をさがして、その下にある、  
   
`config.vm.synced_folder "./share", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']`  
の記述をコメントアウトしてから、共有するディレクトリを上記のように変更(指定)する。  
    
### よくつかう vagrant コマンド
`vagrant status`  
`vagrant global-status`  
`vagrant up`  
`vagrant halt`  
`vagrant destroy` CoreOSのすべてを初期化   
`vagrant reload`  
`vagrant ssh`  
`vagrant box update` CoreOSのアップデート  
  
  
  
## Docker コンテナの作り方
  
### Dockerコンテナを作る手順
 - まずはDockerfileを作る
    - そもそもDockerfileとは?
      - Dockerコンテナ作成のための自動化レシピみたいなもの  
        - Dockerコンテナとは?
          - いままで各作業マシンでやっていた一連の環境設定だとかコマンドライン操作とかのもろもろを、コマンド一発でどの環境でも再現する仕組み(意訳)
          
1. どういうコンテナをつくるか考える
2. coreos内で Dockerfile を作る そして中身を書く
  - ここが一番のキモ
  - うまいこと書くには、コマンドライン操作とかシェルスクリプトとかを習熟していないとツラい
  - 同じようなコンテナがすでに作られていないかdockerで検索してみる
  - 参考にできそうなDockerfileがみつかるかも
3. build → run してちゃんと動く か確認する  
4. うまく動かない場合 coreosのbashで個別のコードがちゃんと動くか確認
5. ちゃんと動くDockerfileが完成
6. GitHubにDockerfileを上げる
7. dockerでAutomated Buildする
 
  
### docker コマンド とDockerfileの 作成例
 - ubuntuのbashを起動  
`coreos> docker run -it ubuntu bash`  
  - 後述のDockerfileで指定したコマンドがうまく動くか確認するのに使うとよい  
 - wget のインストールの例  
`(id)~/ apt-get update && apt-get install -y curl`  
`(id)~/ exit`  
  
 - Dockerfileができたら、buildとrunをして、Dockerコンテナが(ある程度)うまく動くことを確認する  
`coreos> docker build -t [作者名]/[コンテナ名] [Dockerfileの場所]`  
`coreos> docker run -it [作者名]/[コンテナ名]`  

### Dockerfile の例
>  # Docker container for curl  
  FROM ubuntu  
  MAINTAINER Hiromasa Ono, hiromasa.ono@gmail.com  
    
>  # Install packages  
  RUN apt-get update && \  
  apt-get install -y curl  
    
>  CMD ["bash"]  
    
 - https://registry.hub.docker.com/u/hiromasaono/curl/dockerfile/
 - FROM のところは debian にすると一番軽量、だがモノによっては動かないケースがある
 
### GitHub に Dockerfile を add, commit, push
1. [https://github.com/](https://github.com/)へ移動  
2. 右上の+からNew repository をクリック  
3. repositoryの名前はDockerコンテナと同じにする   
   - https://github.com/hiromasaono/curl
   - https://registry.hub.docker.com/u/hiromasaono/curl/
  
`git init`    ←そのディレクトリで初めてgitを使うとき  
`git add Dockerfile`  
`git commit -m "first commit"` 　← -m で変更点などコメントを書く  
`git remote add origin https://github.com/hiromasaono/curl.git`　←githubにレポジトリがない場合に指定する  
`git push -u origin master`  
  
#### よく使うgitコマンドの流れ
`git status`  
`git diff`  
`git add [filename]`  
`git status`  
`git commit` 
`git status`  
`git push origin master`  
`git status`  
 * 何か変更したら　git status で状態確認のくせをつけるとよい  
  
  
### docker で Automated build
1. [https://hub.docker.com/](https://hub.docker.com/)  へ移動  
2. 右上の Add Repository から Automated Build をクリックして buildしたいGitHubのrepository を選択  
3. しばらく待つとDockerコンテナができあがる
4. coreos上で、Dockerコンテナを起動するには、
`docker run -it hiromasaono/curl`
  
##### Automated build をしない場合 (非推奨)
`coreos> docker ps -a` ←　CONTAINER ID(id) を確認する  
`coreos> docker commit (id) hiromasaono/curl`  
`coreos> docker images`  
`coreos> docker login`  
`coreos> docker push hiromasaono/curl`  
 - DockerにRepositoryができる。 
 - 
  
## 参考
 * http://bonohu.jp/blog/2015/02/02/docker-on-coreos-on-mac/
 * http://data.dbcls.jp/~nakazato/it4bio/index.php?DockerStart
 * https://gist.github.com/tcnksm/7700047