docker化Node.js

本示例的目标是告诉你怎样构建你自己的Docker镜像使用Dockerfile。为此我们将创建一个简单的Node.js hello world web应用运行在CentOS上。你可以获得全部源代码https://github.com/enokd/docker-node-hello/。

创建Node.js应用

首先,创建一个目录src,然后创建一个pachage.json文件(描述你的app和app依赖项):

  1. {
  2. "name":"docker-centos-hello",
  3. "private":true,
  4. "version":"0.0.1",
  5. "description":"Node.js Hello world app on CentOS using docker",
  6. "author":"Daniel Gasienica <daniel@gasienica.ch>",
  7. "dependencies":{"express":"3.2.4"}
  8. }

其次,创建一个index.js文件,定义web app使用Express.js框架。

  1. var express =require('express');
  2. // Constantsvar
  3. PORT =8080;
  4. // App
  5. var app = express();
  6. app.get('/',function(req, res){
  7. res.send('Hello world\n');
  8. });
  9. app.listen(PORT);
  10. console.log('Running on http://localhost:'+ PORT);

接下来,我们将展示使用Docker在CentOS容器里运行这个app。首先,你将需要构建一个docker镜像。

创建Dockerfile

创建一个空的文件Dockerfile。

  1. touch Dockerfile

打开Dockerfile。

定义父镜像(你想使用来构建app 镜像基于的镜像)。这里,我们将使用在Docker Hub上的CentOS(tag:centos6):

  1. FROM centos:centos6

刚我们创建一个Node.js应用,所以你得先安装Node.js(npm)在你的CentOS镜像里。Node.js要求运行你的app,npm 安装你定义在package.json的应用依赖项。为了安装正确的package,我们将使用来自Node.js wiki的解释。

  1. # Enable EPEL for Node.js
  2. RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
  3. # Install Node.js and npm
  4. RUN yum install -y npm

为了bundle你的app源代码到docker镜像中,使用COPY 命令。

  1. # Bundle app source
  2. COPY ./src

安装你的app依赖项使用npm二进制。

  1. # Install app dependencies
  2. RUN cd /src; npm install

你的app绑定到端口8080,因此你将使用EXPOSE指令:

  1. EXPOSE 8080

最后,定义运行你app的命令,使用CMD

  1. CMD ["node","/src/index.js"]

构建你的镜像

进入目录,有你的dockerfile和运行如下命令构建docker镜像。-t标志允许你的镜像添加tag,因此,使用的docker images命令,容易发现later。

  1. sudo docker build -t <your username>/centos-node-hello .

你的镜像,现在能被docker列举出来了。

  1. sudo docker images
  2. # Example
  3. REPOSITORY TAG ID CREATED
  4. centos centos6 539c0211cd768 weeks ago
  5. <your username>/centos-node-hello latest d64d3505b0d2 2 hours ago

运行镜像

-d,以隔离模式运行你的镜像,让容器运行在后台。-p标志指定公有端口到容器私有端口。运行你事先构建好的镜像。

  1. sudo docker run -p 49160:8080-d <your username>/centos-node-hello

打印你app的输出:

  1. # Get container ID
  2. sudo docker ps
  3. # Print app output
  4. sudo docker logs <container id>
  5. # ExampleRunning on http://localhost:8080

测试

为了测试你的app,得到你应用(Docker映射的)端口。

  1. sudo docker ps
  2. # ExampleID IMAGE COMMAND ... PORTS
  3. ecce33b30ebf <your username>/centos-node-hello:latest node /src/index.js 49160->8080

在以上的示例中,docker映射容器的8080端口到49160端口。

现在你可以访问app使用curl。

  1. curl -i localhost:49160
  2. HTTP/1.1200 OK
  3. X-Powered-By:Express
  4. Content-Type: text/html; charset=utf-8
  5. Content-Length:12
  6. Date:Sun,02Jun201303:53:22 GMT
  7. Connection: keep-alive
  8. Hello world

如果你使用Boot2docker 在OS X上,端口实际映射到Docker host VM上,你需要使用如下命令:

  1. curl $(boot2docker ip):49160

我们希望这个教程对你有帮助,安装和运行Node.js在CentOS上使用Docker。你可以得到所有源代码 https://github.com/enokd/docker-node-hello/