Docker で開発環境も使い捨てにしよう！

# Docker で開発環境を作る話
こんにちは、Docker 0.9 が出ましたね。
ちょっと Docker を触っていて幾つかアレな点があったので共有しておこうと思います。

その他も合わせてまとめてます。
[私の Docker TIPS ](http://qiita.com/mopemope/items/181cb6c6c6f7cf9bbaa9)

# Docker を使って開発環境、および開発環境の土台を作る
まあよくある Docker の使い方って nginx だの redis だのいろんなサーバーを構築する感じだと思いますが。
今回は開発環境を構築する話をしたいと思います。

よく dotfiles なんかを github においてーなんてことやってる方多いと思います。
もうここは思い切って Docker のイメージにしてしまいましょう。

### 利点
- モテる
- なんかイケてる感じがする
- 案件、プロジェクト毎に個別環境をクリーンなまま維持できる
- みんな同じ環境で作業することができる（ライブラリのバージョンなどが揃う）
- ぶっ壊れても巻き戻し可能(commitしなければ）
- docker さえあればどこでも仕事ができる
- image を作ってる間に一休みできる

### 欠点
- docker である
- docker である
- docker である

ということでよくプロジェクトをまたがったり、いろんな対応していると環境がごちゃごちゃになりがちなので
思い切って分けちゃおう！使い捨てちゃおうってのが今回の話です。
また環境をメンバーで揃えてしまえば「オメーの環境でしか起きねーから！それ！」といった事を防げるかも知れません。

では実際の私が使ってる Dockerfile の一部と共にハマりそうなとこを回避するTIPSを書いていこうと思います。
前提として ubuntu を土台にしてるケースです。

## 0.9 での ssh server でトラブル

みんなが踏むとこですね。現在は解消されているようです。
https://github.com/dotcloud/docker/issues/4605

開発環境のため、基本 ssh server を立ち上げてそこから作業を行うのですが、ログイン後、pty がねえよとか言われる奴です。
ログインするとプロンプトが出てこず壊したくなりますね。
workaround でも書かれてますが run する際にオプションをつけましょう。

```
sudo docker run -t -p 40000:22 mopemope/base
```

## ubuntu 13.10 の sshd の設定で即死

これも踏むやつでしょうか。
開発環境なので、新しいライブラリなども使いたい！そのため ubuntu 13.10を土台にーなんて方も多いんじゃ
ないでしょうか？
とりあえず sshd を普通にたて起動はできた！が！
って事が起こります。
ログイン後、即切断されるってやつですね。
13.10 では pam を見るのでこの設定を書き換えておく必要があります。

```
RUN sed -i 's/.*session.*required.*pam_loginuid.so.*/session optional pam_loginuid.so/g' /etc/pam.d/sshd
```

## fuse で即死

これもみんな踏むとこでしょうか。
apt でいろいろ入れてると fuse 関連にひかかって死ぬパターンですね。
一応以下で回避できますがきっともっといい方法があるでしょう。

```
RUN chmod go+w,u+s /tmp
RUN apt-get install libfuse2
RUN mkdir /tmp/fuse && \
    cd /tmp/fuse && \
    apt-get download fuse && \
    dpkg-deb -x fuse_* . && \
    dpkg-deb -e fuse_* && \
    rm fuse_*.deb && \
    echo -en '#!/bin/bash\nexit 0\n' > DEBIAN/postinst && \
    dpkg-deb -b . /fuse.deb && \
    dpkg -i /fuse.deb && \
    cd / && \
    rm -rf /tmp/fuse /fuse.deb
```

## git clone 時のknown_hosts

dotfiles や ソースなど git clone してくる際に死ぬパターンです。
known_hosts がまっさらなので確認してくるのですがそこで止まってしまいます。
ssh/config などで確認が入らないようにしておきましょう。

```
Host github.com
  StrictHostKeyChecking no

Host bitbucket.org
  StrictHostKeyChecking no
```


## Dockerfile

とまあいろいろあるのですが、使っている Dockerfile をサンプルとして書いておきます。
土台になるとこなので tag は xxxx/base としておきます。
個別環境は別途作成し、FROM xxxx/base として 先ほどの tag を使えばよいでしょう。

このコンテナに

```

ssh -XC ma2@xxxxx -p xxxx

```
でログインして開発すればよいでしょう。

基本、ソースなどの類は VCS などで管理すると思いますが、作業内容の永続化が必要であれば
run する際に -v をつけてマウントしておきましょう。


```

FROM ubuntu:13.10

MAINTAINER mopemope yutaka.matsubara@gmail.com

RUN apt-get -yq update && apt-get -yq upgrade
RUN chmod go+w,u+s /tmp
RUN apt-get install libfuse2
RUN mkdir /tmp/fuse && \
    cd /tmp/fuse && \
    apt-get download fuse && \
    dpkg-deb -x fuse_* . && \
    dpkg-deb -e fuse_* && \
    rm fuse_*.deb && \
    echo -en '#!/bin/bash\nexit 0\n' > DEBIAN/postinst && \
    dpkg-deb -b . /fuse.deb && \
    dpkg -i /fuse.deb && \
    cd / && \
    rm -rf /tmp/fuse /fuse.deb

RUN dpkg-divert --local --rename --add /sbin/initctl && rm -f /sbin/initctl && ln -s /bin/true /sbin/initctl

# install
RUN apt-get install -y openssh-server language-pack-ja zsh tmux git mercurial subversion build-essential python-setuptools python-software-properties
RUN apt-get install -y wget unzip curl p7zip-full mosh xterm tree grep 
RUN apt-get install -y emacs24 vim zsh emacs-mozc-bin fonts-inconsolata fonts-ipafont fonts-ipaexfont rlwrap
RUN apt-get install -y sqlite3 libsqlite3-0 libsqlite3-dev
RUN apt-get install -y firefox gimp mozc-server libreoffice libreoffice-l10n-ja

RUN mkdir /var/run/sshd
RUN echo 'root:root' |chpasswd
RUN locale-gen en_US en_US.UTF-8 && dpkg-reconfigure locales
RUN locale-gen ja_JP ja_JP.UTF-8 && dpkg-reconfigure locales

# sshd config
RUN sed -i 's/.*session.*required.*pam_loginuid.so.*/session optional pam_loginuid.so/g' /etc/pam.d/sshd
RUN /bin/echo -e "LANG=\"ja_JP.UTF-8\"" > /etc/default/local

# Add User
RUN adduser --disabled-password --gecos "" ma2 \
  && echo "ma2 ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \
  && echo 'ma2:ma2' | chpasswd

RUN chsh -s /bin/zsh ma2

# Setup
USER ma2
WORKDIR /home/ma2
ENV HOME /home/ma2

RUN mkdir .ssh
RUN chmod 700 .ssh
ADD id_rsa /home/ma2/.ssh/id_rsa
ADD id_dsa /home/ma2/.ssh/id_dsa
ADD config /home/ma2/.ssh/config

RUN git clone git@bitbucket.org:mopemope/dotfiles.git
RUN zsh dotfiles/setup.sh

# emacs
RUN mkdir .emacs.d
RUN cp dotfiles/init.el .emacs.d
RUN cp dotfiles/mozc.el .emacs.d
RUN cp -R dotfiles/malabar .emacs.d/
RUN cp -R dotfiles/malabar-lib .emacs.d/
RUN cp -R dotfiles/snippets/java-mode .emacs.d/snippets/

# vim
RUN mkdir -p .vim/bundle
RUN git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
RUN cd ~/.vim/bundle/neobundle.vim/bin && ./neoinstall

# codebox
RUN hg clone ssh://hg@bitbucket.org/mopemope/codebox

EXPOSE 22
CMD    /usr/sbin/sshd -D

```