開発環境を作ってるの楽しい人種なので定期的に開発環境を見直したくなります。
Dockerを使ってポータブルな開発環境を手に入れたので紹介します。
開発用コンテナと各種データベースコンテナをdocker-composeを使って構築します。
✗TOC
Dockerポータブルな開発環境
"docker-compose up -d"で開発環境が出来上がります、すごい。mysqlやredis他も使える、すごい。
ディレクトリ構成は以下のようになっています。
|-- data
| |-- mongo
| |-- mysql
| |-- postgresql
| |-- redis
| `-- works
|-- docker-compose.yml
|-- Dockerfile
|-- id_rsa
`-- id_rsa.pub
dataにコンテナ上の永続化したいデータをマウントしています。各データベースのデータと、worksは開発コンテナの~/worksをマウントしており作業はここで行い、作業中のデータは保存されるようになっています。
動かすには、dockerとdocker-composeが入っている環境で以下のコマンドを打ちます。
$ docker-compose build
$ docker-compose pull
$ docker-compose up -d
新しい環境ではこのコマンドを実行して、二回目以降は最後のコマンドだけで立ち上がります。
sshできるようになっているのでホストからsshすればDockerfileに書いてある内容の開発環境が出迎えてくれます。
これで、どの開発機でもDockerとdocker-composeが入っていれば開発環境が立ち上がる体制が作れました。
以下に詳しい内容を書いていきます。
開発用コンテナ
Dockerfileにsshで接続できる開発環境を記述します。含まれている内容は以下になります。
ベース
- Ubuntu 14.04
- ssh
- zsh
- tmux
- dotfiles
- Vim
各言語
- Ruby (rbenv)
- Python (pyenv)
- Node.js (nvm)
- Golang (1.5)
- Clang (3.5)
データベース
- SQLite3
- 各データベースのクライアントツール
普段の開発で雑多に使うため、複数言語+複数データベースの環境を富豪的に作っています。
Webアプリを開発することが多いので、開発で使うお好みのポートをdocker-compose.ymlでポートフォワーディングしておきます。
ev:
restart: always
build: .
ports:
- "5000:5000"
- "8080:8080"
- "8888:8888"
- "2222:22"
volumes:
- ./data/works:/home/yymm/works
ベース
OSはUbuntu 14.04、シェルはzsh、ターミナルマルチプレクサはtmux、エディタはVimです。
基本的なパッケージもインストールしています。
普段からTerminal上で開発することが多いのでVimを使っていて、プラグインにまみれているので、Vimはソースコードからビルドします。
#vim
RUN apt-get install git mercurial gettext libncurses5-dev libperl-dev python-dev python3-dev ruby-dev lua5.2 liblua5.2-dev luajit libluajit-5.1 -y
RUN cd /tmp \
&& git clone https://github.com/vim/vim.git \
&& cd /tmp/vim \
&& ./configure --with-features=huge --enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --with-luajit --enable-fail-if-missing \
&& make \
&& make install
dotfilesは、各環境ごとにブランチで分けているので、os/ubuntu-dockerに切り替えて、bootstrap.shでブートストラップしてます。dotfilesのエイリアスを貼って、Vimプラグインをインストールしてくれます。
# dotfiles
RUN git clone https://github.com/yymm/dotfiles.git ~/dotfiles \
&& cd ~/dotfiles \
&& git checkout os/ubuntu-docker \
&& bash bootstrap.sh
sshできる環境を作るのにハマりどころがいくつかありますので以下の記事を参考にしました。
各言語
言語ごとのバージョンマネージャで使いそうなバージョンをドドっと入れておきます。
必要なバージョンが増えたらDockerfileに追記してビルドし直します。
Ruby (rbenv)
rbenvをインストールして、使うバージョンをインストールします。"rbenv install"するときはまだパスが通っていないので直接叩きます。
# Ruby (rbenv)
RUN git clone https://github.com/rbenv/rbenv.git ~/.rbenv
RUN cd ~/.rbenv && src/configure && make -C src
RUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
RUN echo 'eval "$(rbenv init -)"' >> ~/.zshrc
RUN git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
RUN ~/.rbenv/bin/rbenv install 2.2.4
RUN ~/.rbenv/bin/rbenv install 1.9.3-p551
Python (pyenv)
個人的な事情で2系ではvirtualenvを使いたいので、virtualenvもインストールしています。
pyenvをインストールして、使うバージョンをインストールします。"pyenv install"するときはまだパスが通っていないので直接叩きます。
# Python (virtualenv)
USER root
RUN apt-get install python-pip -y
RUN pip install virtualenv
RUN pip install virtualenvwrapper
USER yymm
RUN echo 'export WORKON_HOME=$HOME/.virtualenvs' >> ~/.zshrc
RUN echo 'source `which virtualenvwrapper.sh`' >> ~/.zshrc
# Python (pyenv)
RUN git clone https://github.com/yyuu/pyenv.git ~/.pyenv
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
RUN echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
RUN echo 'eval "$(pyenv init -)"' >> ~/.zshrc
USER root
RUN apt-get install libssl-dev openssl -y # need to install python 3.4 later
USER yymm
RUN ~/.pyenv/bin/pyenv install 3.5.1
RUN ~/.pyenv/bin/pyenv install 2.7.11
Golang (1.5)
gvmはDockerと相性が悪いらしく今のところ使えません。
しょうがないので、ほしいバージョンを自分で入れるのが今は良いみたいです。
golangはビルド済みのものをダウンロードすることができるので、ダウンロードして/usr/localに展開、環境変数を設定します。
# Golang (1.5)
USER root
RUN wget https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz
RUN tar -C /usr/local -xzf go1.5.linux-amd64.tar.gz
RUN rm -f go1.5.linux-amd64.tar.gz
USER yymm
RUN echo 'export GOROOT="/usr/local/go"' >> ~/.zshrc
RUN echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.zshrc
Node.js (nvm)
nvmをインストールして、使うバージョンをインストールします。
globalで使うnpmパッケージがあるときはここでインストールしておきます。
"nvm install"するときは、~/.nvm/nvm.shを実行する必要があるのでワンライナーにする必要があります。
# Node.js (nvm)
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
ENV NODE_VERSION 5.4.0
ENV NVM_DIR /home/yymm/.nvm
RUN . ~/.nvm/nvm.sh && nvm install $NODE_VERSION && nvm alias default $NODE_VERSION && npm install -g gulp yo hubot coffee-script browserify
データベース
SQLite3は開発コンテナにインストールして、その他のデータベースについてはクライアントを入れておきます。
# SQLite
RUN apt-get install sqlite3 libsqlite3-dev -y
# client
RUN apt-get install mysql-client redis-tools postgresql-client mongodb-clients -y
データベースコンテナ
docker-composeで開発サーバと連携したデータベースコンテナを立てます。
- mysql
- postgresql
- redis
- mongodb
- memcached
を用意して、データはホストのdataディレクトリに永続化させます。
mysql:
restart: always
image: mysql
volumes:
- ./data/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
postgres:
restart: always
image: postgres
volumes:
- ./data/postgresql:/var/lib/postgresql/data
redis:
restart: always
image: redis
volumes:
- ./data/redis:/data
command: redis-server --appendonly yes
mongo:
restart: always
image: mongo
volumes:
- ./data/mongo:/data/db
memcached:
restart: always
image: memcached
開発サーバからlinksでリンクすればよしなに使えます。
dev:
restart: always
build: .
ports:
- "5000:5000"
- "8080:8080"
- "8888:8888"
- "2222:22"
links:
- mysql
- redis
- postgres
- mongo
- memcached
volumes:
- ./data/works:/home/yymm/works
データベースコンテナについては以前に別の記事にまとめてます。
docker-composeでデータベースコンテナを立てるときのTips
付録
実際に使ってるDockerfileとdocker-compose.ymlです。
Dockerfile
docker-compose.yml
Show comments