【Docker】開発時に使ってるコンテナのDockerfileまわり

# なにこれ
WebApp開発したりインフラよりの事をする時に僕がよく使ってる開発用コンテナです。
特定のツールキットが入ったVMをプロビジョニングして使うというスタイルがめんどくさかったので
プロジェクト毎にこのコンテナをばんばん立ち上げて、コンテナ内で開発していくというスタイル。
(Dockerコンテナ内開発で、コンテナにプロジェクトデータの永続化はおすすめ出来ない。BitbucketやGithubにプロジェクトがあって、そこからpullしてこのコンテナ内で開発してpushするというスタイル。開発コンテナはディスポーザブルを想定)



# できること
* PythonとRubyを仮想環境付きで使える
* gcc,g++ 4.9が使える
* javaがうごく
* PostgresSQLがうごく
* Nginxがうごく
* Fluentdがうごく
* InfluxDBがうごく
→ Grafanaで可視化までつかえる
* ElasticSearchがうごく
→ Kibanaで可視化までうごく
* ffmpeg
→これはおまけ

# 調理法
## 用意するもの
以下を　Dockerfileと同じディレクトリに入れる

* 開発コンテナにはいるための鍵(ssh-keygenとかでつくって)
  - id_rsa
  - id_rsa.pub
  - config (Bitbucket用の設定書いたりしとくと、　git pull,pushが捗る)
* 後述する./app/main.sh (初期設定したりするスクリプト)
* ./config (初期設定したりするスクリプト)

## 開発の仕方
### IP転送設定
docker host内でIP転送を有効にしておく。

```bash
sysctl -w net.ipv4.ip_forward=1
```

### ルーティング設定
開発に使うマシンで、下記コマンドを実施。
コンテナへの接続がこれでルーティングされる用になるので、
SSHとかいろいろ外から繋がる様になる。わーいわい。

```bash
route add -net 172.17.0.0/16 192.168.11.12
```

### SSH接続

```bash
ssh docker@172.17.0.2 -i ~/.ssh/docker
```



## コンテナビルド
治したい所だらけですが、一旦動くので公開。無駄なと所本当におおいです。かゆい。
apt-getあたりを整理したい。誰かよろ

```bash
$ vi Dockerfile
→下記の内容をコピペ
$ docker build -t tgr_develop:0.1.0 ./
```

#ファイル類
## Dockerfile
```
### base ###
FROM ubuntu:14.04
MAINTAINER taguro

### add new user ###
RUN useradd -m -d /home/docker -s /bin/bash docker
RUN echo "docker:docker" | chpasswd
RUN echo "docker ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

### use Asia/Tokyo as localtime ###
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:en
ENV LC_ALL ja_JP.UTF-8

### install apt packages ###
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get -y autoclean
RUN apt-get -y clean

### tmux , vim , git , curl ###
RUN apt-get -y install tmux git vim curl

### sshd ###
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
EXPOSE 22

RUN sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
RUN sed -i "s/#AuthorizedKeysFile\t%h\/.ssh\/authorized_keys/AuthorizedKeysFile\t%h\/.ssh\/authorized_keys/" /etc/ssh/sshd_config
RUN sed -i 's/\#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
ADD ./id_rsa /home/docker/.ssh/id_rsa
ADD ./id_rsa.pub /home/docker/.ssh/authorized_keys
ADD ./config /home/docker/.ssh/config
RUN chown -R docker. /home/docker/.ssh

### Postgresql 9.4 ###
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
RUN curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
RUN apt-get -y update
RUN apt-get -y install postgresql-9.4
RUN apt-get -y install postgresql-server-dev-9.4
RUN sed -i 's/local   all             postgres                                peer/local   all             postgres                                trust/' /etc/postgresql/9.4/main/pg_hba.conf

### Nginx ###
RUN apt-get install -y nginx-extras
RUN apt-get install -y redis-server
EXPOSE 80

### Python ###
RUN apt-get install -y libffi-dev
RUN apt-get install -y python-setuptools
RUN apt-get install -y python-dev
RUN easy_install pip
RUN pip install virtualenv virtualenvwrapper
RUN mkdir /home/docker/.virtualenvs
RUN echo "export WORKON_HOME=/home/docker/.virtualenvs" >> /home/docker/.bash_profile
RUN echo "source /usr/local/bin/virtualenvwrapper.sh" >> /home/docker/.bash_profile
RUN chown -R docker. /home/docker
RUN su -l docker -c 'mkvirtualenv --no-site-package --python=/usr/bin/python2.7 env1'

### Ruby ###
RUN apt-get install -y build-essential
RUN apt-get install -y libreadline-dev
RUN git clone https://github.com/sstephenson/rbenv.git /home/docker/.rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /home/docker/.rbenv/plugins/ruby-build
RUN chown docker. -R /home/docker/.rbenv
RUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> /home/docker/.bash_profile
RUN echo 'eval "$(rbenv init -)"' >> /home/docker/.bash_profile
RUN su -l docker -c 'rbenv install 2.2.3'
RUN su -l docker -c 'rbenv rehash'
RUN su -l docker -c 'rbenv global 2.2.3'

### C, C++ ###
RUN apt-get -y update
RUN apt-get install -y software-properties-common python-software-properties
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update -y
RUN apt-get install -y gcc-4.9 g++-4.9
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9

###  jdk-7 ###
RUN apt-get install -y openjdk-7-jre

### Fluentd ###
RUN curl https://packages.treasuredata.com/GPG-KEY-td-agent | apt-key add -
RUN echo "deb http://packages.treasuredata.com/2/ubuntu/precise/ precise contrib" > /etc/apt/sources.list.d/treasure-data.list
RUN apt-get update -y
RUN apt-get install -y td-agent
ADD ./td-agent.conf /etc/td-agent/td-agent.conf
RUN td-agent-gem install -V fluent-plugin-influxdb
EXPOSE 8888

### InfluxDB ###
RUN wget -O /home/docker/influxdb_0.9.6.1_amd64.deb https://s3.amazonaws.com/influxdb/influxdb_0.9.6.1_amd64.deb
RUN chown docker. /home/docker/influxdb_0.9.6.1_amd64.deb
RUN dpkg -i /home/docker/influxdb_0.9.6.1_amd64.deb
EXPOSE 8083

### Grafana ###
RUN wget -O /home/docker/grafana_2.6.0_amd64.deb https://grafanarel.s3.amazonaws.com/builds/grafana_2.6.0_amd64.deb
RUN chown docker. /home/docker/grafana_2.6.0_amd64.deb
RUN dpkg -i /home/docker/grafana_2.6.0_amd64.deb
EXPOSE 3000

### ElasticSearch ###
RUN wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
RUN echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
RUN apt-get -y update
RUN apt-get -y install elasticsearch
RUN td-agent-gem install -V fluent-plugin-elasticsearch
EXPOSE 9200

### Kibana ###
RUN wget -O /home/docker/kibana-4.3.1-linux-x64.tar.gz https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
RUN tar xvzf /home/docker/kibana-4.3.1-linux-x64.tar.gz -C /opt
RUN chown -R docker. /opt/kibana-4.3.1-linux-x64
RUN mv /opt/kibana-4.3.1-linux-x64 /opt/kibana

RUN curl -o /etc/init.d/kibana https://gist.githubusercontent.com/jun06t/ccf8a71bb172bb68f534/raw/755b8a22927f78b5151169f4bbdd1066e182ff60/kibana
RUN chmod +x /etc/init.d/kibana
RUN update-rc.d kibana defaults 96 9
EXPOSE 5601

### Install FFmpeg ###
RUN add-apt-repository ppa:mc3man/trusty-media
RUN apt-get -y update
RUN apt-get -y install ffmpeg

### Launch Script ###
ADD ./app ./root/app
RUN chmod +x /root/app/main.sh
CMD ["bash","-l","/root/app/main.sh"]

```

## ./config
これ書いとくとBitBucketからのpull、pushで用意したSSH鍵id_rsa使ってくれるから便利

```
Host bitbucket.org
  HostName bitbucket.org
  IdentityFile ~/.ssh/id_rsa
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes
```

## ./app/main.sh
各種サービス類立ち上げ用。
このコンテナを特定用途で使いたければここになにかかく。

```bash
# Launch Service
service ssh start
sleep 1
service td-agent start
sleep 1
service influxdb start
sleep 1
service grafana-server start
sleep 1
service elasticsearch start
sleep 1
service kibana start

# テキトー
sleep 10

# InfluxDB
influx -execute 'create database metrics' -format 'json' -pretty

# Nginx
rm /etc/nginx/sites-enabled/default
cp /home/docker/work/routing /etc/nginx/sites-enabled/routing
service nginx start

# Postgres SQL
service postgresql start
psql -U postgres -c "CREATE ROLE hoge_role WITH LOGIN PASSWORD 'password'"
psql -U postgres -c "create database hoge_db owner hoge_role;"

# sleep
while :
do
        sleep 1
done
```