Docker を Mac で使ってみた(Nodeアプリ例)

Docker

色々あってDockerした。さっくりとアプリ作るならHerokuも便利なのだけど、Dockerをサポートする他のPaaSも使えた方が便利そうな風潮を感じたので。

1. インストール&導入

Mac OS X - Docker Documentation

Releases · boot2docker/osx-installer からpkgインストーラをダウンロードして実行。適当にはいる。

boot2docker

Mac OS X上で、Dockerを走らせるためのLinuxなVMを boot2docker で立ち上げられる。(boot2docker/boot2docker はpkgインストーラに含まれている)

boot2docker init
boot2docker up

boot2docker init で初期化 boot2docker up で起動。dockerコマンドにホストを教えるための環境変数を設定する。

export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2375

ここでの DOCKER_HOST はzshrcなどに書いておくほうが良さげ。

Hello World!

docker run ubuntu echo "Hello World"

ここまでがうまくいっていれば ubuntu のイメージがpullされて、Hello Worldが標準出力にでてくる。DOCKER_HOST がうまく通ってなかったりすると、server misbehavingとかエラーが表示される。

Docker Hub ログイン

docker login
Username: …………. 
Password: ……….
Email: ……….
Login Succeeded

ついでにDocker Hubにログインしといた。

2. Dockerfileを使ってみる

今度は Dockerfile を元にイメージを作成してみる。

FROM centos:centos6
EXPOSE 8000
CMD ["touch", "GENERATED_BY_DOCKERFILE”]

docker build でイメージを作成できる。 -t で名前を付けられる。作成したイメージは docker images でリストアップできる。

docker build -t myimage ./
docker images
docker run -t -i myimage bin/bash

docker run で作成したイメージを指定してコマンドを実行できる。上の例ではシェルに入っている。

いらなくなったコンテナやイメージの削除

Dockerで不要になったコンテナやイメージを削除する - @znz blog より下記のようなコマンドでお掃除が可能。あまり便利感がない・・・。

#コンテナの削除
docker rm `docker ps -a -q`

#イメージの削除
docker rmi $(docker images | awk '/^<none>/ { print $3 }’)

nodeのバージョンを指定したサンプル

Nodeのバージョンを 0.11.x で指定したかったので、nvmを使ってみた。Nodeアプリケーション(ブートストラップは /index.js)に Dockerfile を作成したパターン。nvm周りがめんどくさかったけど、結局 bash- c でアレした。

FROM ubuntu:12.04
MAINTAINER Ayumu Sato

# 参考
# http://dignifiedquire.com/nvm-meets-docker/
# https://github.com/daithiocrualaoich/dotlit-scala/blob/master/Dockerfile

# Update apt-get sources AND install packages
RUN     apt-get update
RUN     apt-get install curl git man python make gcc g++ bzip2 -yy

# Set Environment
ENV     HOME /root
ENV     PATH /root/.nvm/v0.11.13/bin:$PATH

# Install nvm & node
RUN     git clone https://github.com/creationix/nvm.git $HOME/.nvm
RUN     bash -c '. $HOME/.nvm/nvm.sh; nvm install 0.11.13 && nvm alias default 0.11.13'

# Bundle app source
ADD     . /src

# Install app dependencies
RUN     cd /src; npm install

# Timezone Setting
RUN     echo "Asia/Tokyo" > /etc/timezone
RUN     dpkg-reconfigure -f noninteractive tzdata

EXPOSE 3000
CMD ["node", "--harmony", "/src/index.js”]

先程と同じように docker builddocker run を実行する。

docker build -t myimage ./
docker run -it -p 80:3000 --name nodesample myimage

ポートは、コンテナの 3000 を Dockerサーバーの 80 にポートフォワーディングして走らせる。(Nodeアプリが3000をlistenすると仮定)

あとは Virtual Box から boot2dockerのNetwork -> Port Forwarding でローカルの任意のポートを、ゲスト(Dockerサーバー)のポート 80 にフォワーディング設定すると、 localhost:8080 とかでDockerの中のアプリを参照できるようになる。

フォワーディング周りのことは はじめてのDocker on Mac OS X | Developers.IO を参考にした。スクショもあって分かりやすい。

便利そう

Dockerfileもシンプルだし、差分管理な分だけ動作が速いしで、手触りが良い印象。

このあと、このNodeアプリはAWS Elastic Beanstalkにデプロイした。そっちも簡単だけど、長くなったので次の記事で。

関係ないけど宣伝

Dockerのドの字もありませんが、フロントエンドエンジニア養成読本、好評発売中です。インフラやらバックエンドな方もぜひどうぞ。