Docker を Mac で使ってみた(Nodeアプリ例)
Posted: Updated:
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 '/^/ { 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 build
と docker 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のドの字もありませんが、フロントエンドエンジニア養成読本、好評発売中です。インフラやらバックエンドな方もぜひどうぞ。