1. Qiita
  2. 投稿
  3. docker

【個人メモ】buildingを使って気軽にDocker containerをつくろう

  • 43
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

buildingとは

仕事を一生懸命していた中、
Twitterのタイムライン中に以下のブログエントリが流れてきた。

http://www.centurylinklabs.com/heroku-on-docker/

heroku-on-docker、パーマリンクからして楽しそうだ。

エントリの内容を見てみると、初文に
アプリケーションをDockerで動かすのは難しい、
もっと簡単にしよう。Herokuみたいに。

と書いてあったので、
これよさ気なんじゃね?と思ったので触ってみた。

検証環境

僕の環境は以下の通り

OS: Mac OS X 10.9.2

開発環境

...今回の検証のためにインストールをする
必要があるソフトウェアは以下の通り。

gistにBrewfileをあげておいた。
homebrewをインストールした後、
以下のコマンドを叩いていってソフトウェアをインストールする。

> ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
> git clone https://gist.github.com/9926658.git
> cd 9926658
> brew bundle

buildingのインストール

buildingはgemパッケージであり、以下のコマンドを実行してインストールする。

> gem install building --no-ri --no-rdoc

なぜグローバルインストールするのか、についてなのだけれど、
Gemfileをアプリケーションと同じディレクトリに置くと
Herokuはrubyアプリケーションとして認識してしまうためだ。

これから、node.jsを利用したサンプルアプリをアップロードするため、
グローバルインストールを行っている。

サンプルアプリをとりあえず作ってみよう

http://www.centurylinklabs.com/heroku-on-docker/

このエントリに書かれているnode.jsアプリを書いてみた。

※以下のgithubリポジトリから、出来上がったテンプレートはcloneできる。

https://github.com/futoase/testing-building

server.js
var PORT = process.env.PORT || 8080;
var express = require('express');

var app = express();
app.use(app.router);

app.get('/', function(req, res) {
  res.send("Welcome to underground");
});

app.listen(PORT);
package.json
{
  "name": "test-app",
  "version": "0.0.1",
  "private": true,
  "main": "server.js",
  "engines": {
    "node": ">=0.10.0",
    "npm": ">=1.3"
  },
  "dependencies": {
    "express": "~3.0"
  }
}

buildingによりDocker imageを作る

以下のコマンドでDocker imageを作成する。

> building test/node-app

docker build が始まり、imageが作成される。。
image が出来上がると、
docker run コマンドでcontainerを作るように促される。

スクリーンショット 2014-04-02 19.15.29.png

今回は、boot2docker の ポート 8080 と、
ホスト(Mac Book Pro Retina 13 inch) のポート 8080 を
明示的にポートフォワードする。

> VBoxManage controlvm "boot2docker-vm" natpf1 "test-port-of-httpd,tcp,127.0.0.1,8080,,8080" # port forwarding from docker container to host.
> docker run -d -p 8080:8080 -e "PORT=8080" test/node-app:latest

ブラウザで開いて、見てみよう。

> open http://localhost:8080/

スクリーンショット 2014-04-02 19.57.58.png

おお、アプリケーションが起動している。

herokuにもpushしてみよう。

herokuにもpushしてみよう。
Procfileを書いて置くことを忘れずに。

Procfile
web: node server.js
> heroku create
> git push heroku master
> open http://foolish-bastion-2718.herokuapp.com/

スクリーンショット 2014-04-02 20.00.13.png

うむ。動いている。

build-packを試してみたが...

参考にしているエントリでは、
build-pack-hhvmを適用して、
wordpressをhhvmにて動かしていた。

スクリーンショット 2014-04-02 20.10.55.png

build-pack、すでにあるものを
カスタマイズして適用してみるか、と思って
試してみた。

対象とするのは以下のbuild-pack。
(このbuild-packは、すでにdocker imagesに入っているものだ)

https://github.com/CHH/heroku-buildpack-php

display_errors=on

に変更したphp.iniを適用した
build-packを使ってみようと思った。

カスタマイズしたbuild-packはすでに作ってある。

https://github.com/futoase/heroku-buildpack-php

早速適用しようと思ったものの...

Dockerfileを用意してやったけど、色々とハマった。

1) すでにある同じbuild-packは使えない

buildpackを引数に渡してbuildingを実行することで
buildpackを追加できるようなので以下のコマンドを実行して試してみた。

> building -b https://github.com/futoase/heroku-buildpack-php futoase/faid-app

が、git clone する時点で、同じbuild-packが存在する、と怒られる。

スクリーンショット 2014-04-01 22.49.35.png

うぅ

2) カスタマイズしたDockerfileを用意しても結局デフォルトのDockerfileに上書きされてしまう

以下のDocker commandを実行し、
自分がカスタマイズしたbuild packを適用しようと試みた。

Dockerfile
FROM ctlc/buildstep:ubuntu13.10

RUN find /build/buildpacks -type d -delete
RUN truncate --size 0 /build/buildpacks.txt

RUN git clone --depth 1 https://github.com/futoase/heroku-buildpack-php /build/buildpacks/heroku-buildpack-php
RUN echo https://github.com/futoase/heroku-buildpack-php-test >> /build/buildpacks.txt
ADD . /app
RUN /build/builder
CMD /start web

buildingにオプションを引き渡し、
カスタマイズしたbuild-packを利用しつつ、
作成したDockerfileを適用しようとした。

> building -d Dockerfile futoase/faild-app test

が、無理だった。
buildingを実行したディレクトリで作成されたDockerfileは、
意図したものにはならなかった。

Dockerfile
FROM ctlc/buildstep:ubuntu13.10
FROM ctlc/buildstep:ubuntu13.10
ADD . /app
RUN /build/builder
CMD /start web

うーむ、コマンド行が全部削除されてしまった。

buildingが利用するdocker imageにすでに含まれている
build-packを利用する場合は、カスタマイズは諦めたほうがよいのかな。

https://index.docker.io/u/ctlc/buildstep/

に含まれているbuild-packは以下の通り。

buildingの活用方法

弄ってみて、わかったのは

  1. Herokuアプリを動かそうというプロダクトではない(そう言ってるし)。あくまでHeroku風だ。
  2. Herokuアプリを作るかの如くDocker上でアプリを実行できる環境を気軽に作れるものだ
  3. すでに一覧に出したが、数多くのheroku-build-packをdocker imageに包含している。ansibleなどで言語環境を構築する手間が省けると思う

ということか。ウェブアプリを作る上で、
動作環境を作るのが億劫で、Herokuでの
アプリ作成ノウハウの延長線上で作りたくて、

> building hoge/app-name

とコマンド打ち込むだけでアプリの動作環境が作れる(docker image)、且つ
Docker上でアプリが立ち上がるのですぐに動作確認が行えるのは楽だ。

boot2dockerのWindows向けinstallerも公開されているので、
Mac OS X ユーザが作ったアプリのモックアップを
Windows ユーザに向けてさくっと送りつけて実行させたい
場合に役に立ちそうだ。