注意:——如果你不喜歡sudo,可以查看非root用戶使用
這個(gè)例子的目的是向您展示如何通過(guò)使用Dockerfile來(lái)構(gòu)建自己的docker鏡像。我們通過(guò)在Centos上運(yùn)行一個(gè)簡(jiǎn)單node.jsweb應(yīng)用輸出'hello word'。您可以在https://github.com/enokd/docker-node-hello/獲得完整的源代碼。
首先,先創(chuàng)建一個(gè)文件存放目錄src。然后創(chuàng)建package.json來(lái)描述你的應(yīng)用程序和依賴關(guān)系:
{
"name": "docker-centos-hello",
"private": true,
"version": "0.0.1",
"description": "Node.js Hello world app on CentOS using docker",
"author": "Daniel Gasienica <daniel@gasienica.ch>",
"dependencies": {
"express": "3.2.4"
}
}
然后,創(chuàng)建一個(gè)index.js文件使用Express.js框架來(lái)做一個(gè)web用用程序:
var express = require('express');
// Constants
var PORT = 8080;
// App
var app = express();
app.get('/', function (req, res) {
res.send('Hello world\n');
});
app.listen(PORT);
console.log('Running on http://localhost:' + PORT);
在接下來(lái)的步驟中,我們將看到如何使用docker的centos容器來(lái)運(yùn)行這個(gè)應(yīng)用程序。首先,你需要為你的應(yīng)用程序創(chuàng)建一個(gè)docker鏡像。
創(chuàng)建一個(gè)空文件叫Dockerfile:
touch Dockerfile
使用你喜歡的編輯器打開(kāi)Dockerfile,并添加如下,定義了docker鏡像需要構(gòu)建的版本(這個(gè)示例使用docker 0.3.4)
# DOCKER-VERSION 0.3.4
接下來(lái),定義構(gòu)建自己鏡像的頂級(jí)鏡像。在這里我們使用Centos(tag:6.4):
FROM centos:6.4
因?yàn)槲覀円獦?gòu)建一個(gè)Node.js應(yīng)用,你需要在你的Centos鏡像中安裝Node.js。Node.js運(yùn)行應(yīng)用程序需要使用npm安裝你package.json中定義的依賴關(guān)系。安裝Centos包,你可以查看Node.js維基指令:
# Enable EPEL for Node.js
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN yum install -y npm
將你的應(yīng)用程序源代碼添加到你的Docker鏡像中,使用ADD指令:
# Bundle app source
ADD . /src
使用npm安裝你的應(yīng)用程序依賴:
# Install app dependencies
RUN cd /src; npm install
應(yīng)用程序綁定到端口8080,您將使用EXPOSE指令做docker進(jìn)程映射:
EXPOSE 8080
最后,定義命令,使用CMD定義運(yùn)行時(shí)的node服務(wù)和應(yīng)用src/index.js的路徑(看我們添加源代碼到容器的步驟):
CMD ["node", "/src/index.js"]
你的Dockerfile現(xiàn)在看起來(lái)像如下這樣:
# DOCKER-VERSION 0.3.4
FROM centos:6.4
# Enable EPEL for Node.js
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN yum install -y npm
# Bundle app source
ADD . /src
# Install app dependencies
RUN cd /src; npm install
EXPOSE 8080
CMD ["node", "/src/index.js"]
去到你的Dockerfile目錄下,運(yùn)行命令來(lái)構(gòu)建鏡像。-t參數(shù)給鏡像添加標(biāo)簽,為了讓我們?cè)?code>docker images命令更容易查找到它:
$ sudo docker build -t <your username>/centos-node-hello .
你的鏡像現(xiàn)在將在列表中:
$ sudo docker images
# Example
REPOSITORY TAG ID CREATED
centos 6.4 539c0211cd76 8 weeks ago
<your username>/centos-node-hello latest d64d3505b0d2 2 hours ago
使用-d參數(shù)來(lái)運(yùn)行你的鏡像使容器在后臺(tái)運(yùn)行。使用-p參數(shù)來(lái)綁定一個(gè)公共端口到私有容器端口上。運(yùn)行你之前構(gòu)建的鏡像:
$ sudo docker run -p 49160:8080 -d <your username>/centos-node-hello
打印應(yīng)用輸出:
# Get container ID
$ sudo docker ps
# Print app output
$ sudo docker logs <container id>
# Example
Running on http://localhost:8080
要測(cè)試應(yīng)用程序,先得到docker應(yīng)用程序映射的端口:
$ sudo docker ps
# Example
ID IMAGE COMMAND ... PORTS
ecce33b30ebf <your username>/centos-node-hello:latest node /src/index.js 49160->8080
在上面的示例中,docker映射容器的49160端口到8080端口。
現(xiàn)在你可以使用curl來(lái)訪問(wèn)你的app(安裝curl:sudo apt-get install curl):
$ curl -i localhost:49160
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
Date: Sun, 02 Jun 2013 03:53:22 GMT
Connection: keep-alive
Hello world
我們希望本教程能夠幫助您在Docker上的Centos鏡像運(yùn)行Node.js。你可以獲得全部源代碼https://github.com/gasi/docker-node-hello。