• このエントリーをはてなブックマークに追加


お手本

を基に,ベースを ubuntu:13.04 としてビルドしてみる練習.イメージ名は test/nodejs_app

ファイル構成を準備する

構成

$ cd ~/tmp/nodejs_app
$ tree
.
├── Dockerfile
└── src
    ├── index.js
    └── package.json
 
1 directory, 3 files

アプリケーション関連

index.jspackage.json はチュートリアルのとおり.(express のバージョンだけ 4.0.0 に変更しています.)

Dockerfile

Dockerfile はとりあえずこんな感じ:

# DOCKER-VERSION 0.10.0
FROM ubuntu:13.04
RUN  apt-get update
RUN  apt-get install -y curl
RUN  mkdir /tmp/node; cd /tmp/node; curl -L "http://nodejs.org/dist/v0.10.26/node-v0.10.26-linux-x64.tar.gz" | tar zxf -
RUN  if [ ! -d /usr/local/bin ]; then mkdir /usr/local/bin; fi; cp -v /tmp/node/node-v0.10.26-linux-x64/bin/node /usr/local/bin/node
RUN  curl -L "https://www.npmjs.org/install.sh" | clean=no sh
RUN  ldconfig
 
ADD  ./src /src
RUN  cd /src; npm install
 
EXPOSE  8080
CMD [ "node", "/src/index.js" ]

RUN する内容がふくれてきた場合は,シェルスクリプトとかに落としこんで,それを ADD して RUN bash /script/foo.sh みたいにすればすっきりするでしょうか.

ビルドする!

$ sudo docker build -t test/nodejs_app:bar .
Uploading context  72.7 kB
Uploading context
Step 0 : FROM    ubuntu:13.04
 ---> ab4344e23e3a
Step 1 : RUN     apt-get update
 ---> Running in 211a196ce52b
Hit http://archive.ubuntu.com raring Release.gpg
...
Hit http://archive.ubuntu.com raring-security/universe amd64 Packages
Reading package lists...
 ---> 8a247da1250e
Step 2 : RUN     apt-get install -y curl
 ---> Running in 033260120f50
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
...
Running hooks in /etc/ca-certificates/update.d....done.
 ---> a13ba87694ea
Step 3 : RUN     mkdir /tmp/node; cd /tmp/node; curl -L "http://nodejs.org/dist/v0.10.26/node-v0.10.26-linux-x64.tar.gz" | tar zxf -
 ---> Running in 77f96b1eeef2
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 5190k  100 5190k    0     0  1549k      0  0:00:03  0:00:03 --:--:-- 1560k
 ---> 794382b45dac
Step 4 : RUN     if [ ! -d /usr/local/bin ]; then mkdir /usr/local/bin; fi; cp -v /tmp/node/node-v0.10.26-linux-x64/bin/node /usr/local/bin/node
 ---> Running in 7e3febdb7802
'/tmp/node/node-v0.10.26-linux-x64/bin/node' -> '/usr/local/bin/node'
 ---> 8e195c75dd5e
Step 5 : RUN     curl -L "https://www.npmjs.org/install.sh" | clean=no sh
 ---> Running in 42bddedda16c
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6711  100  6711    0     0  19219      0 --:--:-- --:--:-- --:--:-- 21648
tar=/bin/tar
...
install npm@latest
fetching: http://registry.npmjs.org/npm/-/npm-1.4.6.tgz
0.10.26
1.4.6
Skipping 0.x cruft clean
/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
npm@1.4.6 /usr/local/lib/node_modules/npm
It worked
 ---> 6df4401438df
Step 6 : RUN     ldconfig
 ---> Running in d3b1d42030e9
 ---> b11e4f73888f
Step 7 : ADD  ./src /src
 ---> fd41aca555a4
Step 8 : RUN  cd /src; npm install
 ---> Running in 74048f492be8
npm http GET https://registry.npmjs.org/express/4.0.0
npm http 200 https://registry.npmjs.org/express/4.0.0
...
express@4.0.0 node_modules/express
├── methods@0.1.0
├── parseurl@1.0.1
...
├── accepts@1.0.0 (mime@1.2.11, negotiator@0.3.0)
└── serve-static@1.0.1 (send@0.1.4)
 ---> 9367e551873d
Step 9 : EXPOSE  8080
 ---> Running in 490f24363506
 ---> 71870cdca344
Step 10 : CMD [ "node", "/src/index.js" ]
 ---> Running in 2549cebac77c
 ---> c465062641f5
Successfully built c465062641f5
Removing intermediate container 77f96b1eeef2
Removing intermediate container 7e3febdb7802
Removing intermediate container 3b6ec29995a9
Removing intermediate container 211a196ce52b
Removing intermediate container 033260120f50
Removing intermediate container 42bddedda16c
Removing intermediate container d3b1d42030e9
Removing intermediate container 74048f492be8
Removing intermediate container 490f24363506
Removing intermediate container 2549cebac77c

ビルド完了.

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test/nodejs_app     bar                 c465062641f5        19 minutes ago      230.9 MB
...

イメージができあがりました.

ステップごとのキャッシュ?

そういえば,「成功したステップはキャッシュされる」って,clairvy さんが このあたりのエントリ 書いてたときに言ってた気がします.

確かに,apt-get update のステップとか再ビルドの時とか発動しなかった感じです.(あとで調べたら,--no-cache ってオプションがあり,まぁその名のとおりですね.)

ビルドしたイメージからコンテナを起動する

コンテナを起動する

このあたりはチュートリアルに従って:

$ sudo docker run -p 49160:8080 -d test/nodejs_app
5202d212e7b73b73ede8ff8297b1386448525f0a74c634acf49dfa510daf185b
$ sudo docker ps
CONTAINER ID        IMAGE                    COMMAND              CREATED             STATUS              PORTS                     NAMES
5202d212e7b7        test/nodejs_app:latest   node /src/index.js   14 seconds ago      Up 14 seconds       0.0.0.0:49160->8080/tcp   lonely_wozniak

HTTP リクエストする

$ curl http://localhost:8080/
curl: (7) couldn't connect to host

これは間違いw

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

きました.

コンテナに IP アドレスを割り当てて HTTP リクエストしてみる

前エントリ で練習した Pipework を,ここで使ってみます.192.168.10.10 として割り当てた後,http://192.168.10.10:8080/ へリクエストしてみます:

$ sudo pipework br1 5202d212e7b7  192.168.10.10/24
$ curl http://192.168.10.10:8080/
Hello World

期待どおりの結果が得られました.