仮想化環境のDocker(Ubuntu)でNode.js&Hello Worldしてみた。

仮想化環境のコンテナを作るDockerが面白そうなので試してみた。

色々つまずいたところがあったが、別途書く事にする。

我が家の環境はUbuntuなので、オフィシャル環境のサンプル(docker-node-hello)Ubuntuベースに修正して動かしてみる。

Dockerfileは以下の通り。

# Node.js for ubuntu
#
# VERSION       0.1.0
#
# ORIGINAL      https://github.com/gasi/docker-node-hello
#
# AUTHER        .h2o
#
# Use the Ubuntu base image provided by dotCloud
FROM ubuntu:12.04

# Install Node.js and npm
RUN     apt-get update
RUN     apt-get install -y python-software-properties
RUN     add-apt-repository -y ppa:chris-lea/node.js
RUN     echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN     apt-get update
RUN     apt-get install -y nodejs

# App
ADD . /src
# Install app dependencies
RUN cd /src; npm install

EXPOSE  8080
CMD ["node", "/src/index.js"]

Dockerfileとオリジナル環境のindex.js,package.jsonを同じフォルダに配置し、以下のコマンドを実行(node.js必須ファイルやnpmでパッケージのインストールが実施されるため5分ほど時間が掛かった...)

$ sudo docker build .
Uploading context 10240 bytes
Step 1 : FROM ubuntu:12.04
 ---> 8dbd9e392a96
Step 2 : RUN apt-get update
 ---> Using cache
 ---> a0db8bf1e649
Step 3 : RUN apt-get install -y python-software-properties
 ---> Running in 6c464e4fceac
Reading package lists...
Building dependency tree...
The following extra packages will be installed:
  apt-utils ca-certificates file iso-codes krb5-locales libapt-inst1.4
  libasn1-8-heimdal libcurl3-gnutls libexpat1 libgcrypt11 libgnutls26
  libgpg-error0 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal
  libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libidn11
  libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0
  libldap-2.4-2 libmagic1 libp11-kit0 libroken18-heimdal librtmp0 libsasl2-2
  libsasl2-modules libsqlite3-0 libtasn1-3 libwind0-heimdal lsb-release
  mime-support openssl python python-apt python-apt-common
  python-gnupginterface python-pycurl python2.7 ucf unattended-upgrades
  xz-lzma
Suggested packages:
  isoquery rng-tools gnutls-bin krb5-doc krb5-user libsasl2-modules-otp
  libsasl2-modules-ldap libsasl2-modules-sql libsasl2-modules-gssapi-mit
  libsasl2-modules-gssapi-heimdal lsb python-doc python-tk python-apt-dbg
  python-gtk2 python-vte python-apt-doc libcurl4-gnutls-dev python-pycurl-dbg
  python2.7-doc binutils bsd-mailx
The following NEW packages will be installed:
  apt-utils ca-certificates file iso-codes krb5-locales libapt-inst1.4
  libasn1-8-heimdal libcurl3-gnutls libexpat1 libgcrypt11 libgnutls26
  libgpg-error0 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal
  libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libidn11
  libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0
  libldap-2.4-2 libmagic1 libp11-kit0 libroken18-heimdal librtmp0 libsasl2-2
  libsasl2-modules libsqlite3-0 libtasn1-3 libwind0-heimdal lsb-release
  mime-support openssl python python-apt python-apt-common
  python-gnupginterface python-pycurl python-software-properties python2.7 ucf
  unattended-upgrades xz-lzma
0 upgraded, 47 newly installed, 0 to remove and 0 not upgraded.
Need to get 11.6 MB of archives.
After this operation, 42.4 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main libapt-inst1.4 amd64 0.8.16~exp12ubuntu10 [102 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ precise/main libexpat1 amd64 2.0.1-7.2ubuntu1 [131 kB]
Get:3 http://archive.ubuntu.com/ubuntu/ precise/main libsqlite3-0 amd64 3.7.9-2ubuntu1 [348 kB]
Get:4 http://archive.ubuntu.com/ubuntu/ precise/main libroken18-heimdal amd64 1.6~git20120311.dfsg.1-2 [46.0 kB]
Get:5 http://archive.ubuntu.com/ubuntu/ precise/main libasn1-8-heimdal amd64 1.6~git20120311.dfsg.1-2 [220 kB]
Get:6 http://archive.ubuntu.com/ubuntu/ precise/main libgpg-error0 amd64 1.10-2ubuntu1 [14.5 kB]
Get:7 http://archive.ubuntu.com/ubuntu/ precise/main libgcrypt11 amd64 1.5.0-3 [280 kB]
Get:8 http://archive.ubuntu.com/ubuntu/ precise/main libp11-kit0 amd64 0.12-2ubuntu1 [34.3 kB]
Get:9 http://archive.ubuntu.com/ubuntu/ precise/main libtasn1-3 amd64 2.10-1ubuntu1 [43.1 kB]
Get:10 http://archive.ubuntu.com/ubuntu/ precise/main libgnutls26 amd64 2.12.14-5ubuntu3 [459 kB]
Get:11 http://archive.ubuntu.com/ubuntu/ precise/main libkrb5support0 amd64 1.10+dfsg~beta1-2 [23.5 kB]
Get:12 http://archive.ubuntu.com/ubuntu/ precise/main libk5crypto3 amd64 1.10+dfsg~beta1-2 [79.9 kB]
Get:13 http://archive.ubuntu.com/ubuntu/ precise/main libkeyutils1 amd64 1.5.2-2 [7862 B]
Get:14 http://archive.ubuntu.com/ubuntu/ precise/main libkrb5-3 amd64 1.10+dfsg~beta1-2 [354 kB]
Get:15 http://archive.ubuntu.com/ubuntu/ precise/main libgssapi-krb5-2 amd64 1.10+dfsg~beta1-2 [118 kB]
Get:16 http://archive.ubuntu.com/ubuntu/ precise/main libidn11 amd64 1.23-2 [112 kB]
Get:17 http://archive.ubuntu.com/ubuntu/ precise/main libhcrypto4-heimdal amd64 1.6~git20120311.dfsg.1-2 [103 kB]
Get:18 http://archive.ubuntu.com/ubuntu/ precise/main libheimbase1-heimdal amd64 1.6~git20120311.dfsg.1-2 [33.0 kB]
Get:19 http://archive.ubuntu.com/ubuntu/ precise/main libwind0-heimdal amd64 1.6~git20120311.dfsg.1-2 [77.8 kB]
Get:20 http://archive.ubuntu.com/ubuntu/ precise/main libhx509-5-heimdal amd64 1.6~git20120311.dfsg.1-2 [125 kB]
Get:21 http://archive.ubuntu.com/ubuntu/ precise/main libkrb5-26-heimdal amd64 1.6~git20120311.dfsg.1-2 [234 kB]
Get:22 http://archive.ubuntu.com/ubuntu/ precise/main libheimntlm0-heimdal amd64 1.6~git20120311.dfsg.1-2 [16.0 kB]
Get:23 http://archive.ubuntu.com/ubuntu/ precise/main libgssapi3-heimdal amd64 1.6~git20120311.dfsg.1-2 [108 kB]
Get:24 http://archive.ubuntu.com/ubuntu/ precise/main libsasl2-2 amd64 2.1.25.dfsg1-3 [69.8 kB]
Get:25 http://archive.ubuntu.com/ubuntu/ precise/main libldap-2.4-2 amd64 2.4.28-1.1ubuntu4 [186 kB]
Get:26 http://archive.ubuntu.com/ubuntu/ precise/main librtmp0 amd64 2.4~20110711.gitc28f1bab-1 [57.1 kB]
Get:27 http://archive.ubuntu.com/ubuntu/ precise/main openssl amd64 1.0.1-4ubuntu3 [523 kB]
Get:28 http://archive.ubuntu.com/ubuntu/ precise/main ca-certificates all 20111211 [169 kB]
Get:29 http://archive.ubuntu.com/ubuntu/ precise/main libcurl3-gnutls amd64 7.22.0-3ubuntu4 [227 kB]
Get:30 http://archive.ubuntu.com/ubuntu/ precise/main apt-utils amd64 0.8.16~exp12ubuntu10 [191 kB]
Get:31 http://archive.ubuntu.com/ubuntu/ precise/main libmagic1 amd64 5.09-2 [217 kB]
Get:32 http://archive.ubuntu.com/ubuntu/ precise/main file amd64 5.09-2 [19.7 kB]
Get:33 http://archive.ubuntu.com/ubuntu/ precise/main mime-support all 3.51-1ubuntu1 [30.7 kB]
Get:34 http://archive.ubuntu.com/ubuntu/ precise/main python2.7 amd64 2.7.3-0ubuntu3 [2663 kB]
Get:35 http://archive.ubuntu.com/ubuntu/ precise/main python amd64 2.7.3-0ubuntu2 [166 kB]
Get:36 http://archive.ubuntu.com/ubuntu/ precise/main lsb-release all 4.0-0ubuntu20 [10.7 kB]
Get:37 http://archive.ubuntu.com/ubuntu/ precise/main ucf all 3.0025+nmu2ubuntu1 [54.4 kB]
Get:38 http://archive.ubuntu.com/ubuntu/ precise/main iso-codes all 3.31-1 [3547 kB]
Get:39 http://archive.ubuntu.com/ubuntu/ precise/main krb5-locales all 1.10+dfsg~beta1-2 [8886 B]
Get:40 http://archive.ubuntu.com/ubuntu/ precise/main libsasl2-modules amd64 2.1.25.dfsg1-3 [63.4 kB]
Get:41 http://archive.ubuntu.com/ubuntu/ precise/main python-apt-common all 0.8.3ubuntu7 [21.5 kB]
Get:42 http://archive.ubuntu.com/ubuntu/ precise/main python-apt amd64 0.8.3ubuntu7 [188 kB]
Get:43 http://archive.ubuntu.com/ubuntu/ precise/main python-gnupginterface all 0.3.2-9.1ubuntu3 [19.2 kB]
Get:44 http://archive.ubuntu.com/ubuntu/ precise/main xz-lzma all 5.1.1alpha+20110809-3 [12.4 kB]
Get:45 http://archive.ubuntu.com/ubuntu/ precise/main unattended-upgrades all 0.76 [25.1 kB]
Get:46 http://archive.ubuntu.com/ubuntu/ precise/main python-pycurl amd64 7.19.0-4ubuntu3 [49.2 kB]
Get:47 http://archive.ubuntu.com/ubuntu/ precise/main python-software-properties all 0.82.7 [22.2 kB]
debconf: delaying package configuration, since apt-utils is not installed

(一部省略)
npm http 200 https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz
npm http 200 https://registry.npmjs.org/qs/-/qs-0.6.4.tgz
npm WARN engine formidable@1.0.13: wanted: {"node":"<0.9.0"} (current: {"node":"v0.10.22","npm":"1.3.14"})
express@3.2.4 node_modules/express
├── methods@0.0.1
├── fresh@0.1.0
├── cookie-signature@1.0.1
├── range-parser@0.0.4
├── debug@0.7.4
├── buffer-crc32@0.2.1
├── cookie@0.0.5
├── commander@0.6.1
├── mkdirp@0.3.4
├── send@0.1.0 (mime@1.2.6)
└── connect@2.7.9 (pause@0.0.1, qs@0.6.4, bytes@0.2.0, formidable@1.0.13)
 ---> 49a8f7a4de73
Step 10 : EXPOSE 8080
 ---> Running in 3c8b55b6db87
 ---> af36f5688a4f
Step 11 : CMD ["node", "/src/index.js"]
 ---> Running in 9f1a7146a9c1
 ---> b02edbb349f6
Successfully built b02edbb349f6
$ sudo docker commit 9f1a7146a9c1 .h2o/node-hello

イメージ化も終わったので、それじゃあ動かしてみる。

ポートのマッッピング設定を行わないとコンテナ外からは通信できないので注意
(ここではコンテナ内の8080を実環境の8080にマッピングしてcurlでアクセスする)

$ sudo docker run -p 127.0.0.1:8080:8080 -d -i -t .h2o/node-hello /usr/bin/node src/index.js
029894558827
$ sudo docker logs 029894558827
Running on http://localhost:8080
$ sudo docker ps
CONTAINER ID        IMAGE                    COMMAND                CREATED              STATUS              PORTS                      NAMES
029894558827        .h2o/node-hello:latest   /usr/bin/node src/in   About a minute ago   Up About a minute   127.0.0.1:8080->8080/tcp   navy_octopus 

リアル環境からアクセスしてみると。

$ curl http://localhost:8080/
Hello World

Good Job!

参考にしたページ:
仮想環境構築に docker を使う - apatheia.info
CoreOS を使って docker を体験した - ようへいの日々精進XP