docker-composeを使って最高の開発環境を手に入れた
  • Date:Wednesday 13 January 2016 (AM 01:08:23)
  • Updated:Wednesday 27 January 2016 (AM 05:12:02)
  • Tags:Docker
  • Category:Programming

開発環境を作ってるの楽しい人種なので定期的に開発環境を見直したくなります。

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

Adsense

Share

  • このエントリーをはてなブックマークに追加

About

趣味でプログラミングをしています。仕事では致し方なくC言語のようなC++を書いています。

Tags

Pages