話題の記事

Docker Language Stackを使って一撃で開発環境を構築する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

少々前の話題で恐縮ですが、Docker Hub Registryの公式レポジトリとして、複数のLanguage Stackが公開されました。

これは各種開発言語のそれぞれのバージョンをDockerコンテナで簡単に使えるようにしたものです。

例えばUbuntuコンテナでRubyを使いたい場合、

  • apt-getでruby、ruby-devのインストール
  • apt-getでrubygemsのインストール
  • gemでbundlerのインストール

のようなことをDockerfileで行う必要があります。特定のRubyのバージョンを使いたいなら更にrbenvなどを使わなくてはいけません。これはとても面倒臭いです。しかしLanguage Stackのrubyを使えば一撃で特定バージョンの開発環境をセットアップすることができます。

ということでやってみました!

やってみる

Mac OS X上のboot2dockerを使いました。

Rubyのlatestバージョンを使う

rubyのlatestバージョンを使いたい場合、以下のようにdocker runします。

$ docker run -it ruby:latest /bin/bash
Status: Image is up to date for ruby:latest
root@2e7bdea07e7d:/#

rubyの状態を確認してみます。

root@2e7bdea07e7d:/# ruby -v
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux]

ちゃんとrubyの環境が整っています。

Railsアプリをコンテナ化する

このLaunguage StackはONBUILDがサポートされたイメージも配置されています。別のDockerfileから参照することで、簡単に開発環境が含まれたコンテナを作成することができます。

例としてrailsのONBUILDイメージを使ってみます。以下のように新規にrailsアプリケーションを作ってみます。

$ rails new project

そのrailsアプリケーションのディレクトリの中でDockerfileを作成します。今回は特に難しいことをしないので、ONBUILDイメージを参照しているだけです。

$ cd project
$ vi Dockerfile
FROM rails:onbuild

このrails:onbuildの内容はこちら。FROMでrubyイメージが呼ばれており、そこでRubyの開発環境が設定されています。またGemfileとGemfile.lockのCOPY、bundle install、アプリケーションディレクトリのCOPYなどが行われています。この辺を全部手でDockerfileに書くと超面倒臭いのですが、たった1行で済みます!

ではdocker buildしてみます。

$ docker build -t local/project .
Successfully built 30a76b57a6c6

$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
local/project              latest              30a76b57a6c6        About a minute ago   844.9 MB

作成されたDockerイメージを起動します。

$ docker run -d -p 3000:3000 local/project
afe2fdf78f5c8a63fc3dc55172023cd5b06f5c1653b85b0ac8d8788437c65c5f

$ docker ps
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS                    NAMES
afe2fdf78f5c        local/project:latest   "rails server"      6 seconds ago       Up 5 seconds        0.0.0.0:3000->3000/tcp   insane_pike

あとはDockerコンテナの3000/tcpに接続すれば、以下のようにRuby on Railsの初期画面が表示されます。

Ruby_on_Rails__Welcome_aboard

さいごに

ちょっとスクリプトを作りたい、違うバージョンで動作確認したいなど、実際に手元でやると面倒臭い環境のセットアップが、コマンド一発で出来てしまいます。便利ですね!