github.com/guilhermebr/docker@v1.4.2-0.20150428121140-67da055cebca/docs/sources/examples/nodejs_web_app.md (about)

     1  page_title: Dockerizing a Node.js web app
     2  page_description: Installing and running a Node.js app with Docker
     3  page_keywords: docker, example, package installation, node, centos
     4  
     5  # Dockerizing a Node.js web app
     6  
     7  > **Note**: 
     8  > - **If you don't like sudo** then see [*Giving non-root
     9  >   access*](/installation/binaries/#giving-non-root-access)
    10  
    11  The goal of this example is to show you how you can build your own
    12  Docker images from a parent image using a `Dockerfile`
    13  . We will do that by making a simple Node.js hello world web
    14  application running on CentOS. You can get the full source code at
    15  [https://github.com/enokd/docker-node-hello/](https://github.com/enokd/docker-node-hello/).
    16  
    17  ## Create Node.js app
    18  
    19  First, create a directory `src` where all the files
    20  would live. Then create a `package.json` file that
    21  describes your app and its dependencies:
    22  
    23      {
    24        "name": "docker-centos-hello",
    25        "private": true,
    26        "version": "0.0.1",
    27        "description": "Node.js Hello world app on CentOS using docker",
    28        "author": "Daniel Gasienica <daniel@gasienica.ch>",
    29        "dependencies": {
    30          "express": "3.2.4"
    31        }
    32      }
    33  
    34  Then, create an `index.js` file that defines a web
    35  app using the [Express.js](http://expressjs.com/) framework:
    36  
    37      var express = require('express');
    38  
    39      // Constants
    40      var PORT = 8080;
    41  
    42      // App
    43      var app = express();
    44      app.get('/', function (req, res) {
    45        res.send('Hello world\n');
    46      });
    47  
    48      app.listen(PORT);
    49      console.log('Running on http://localhost:' + PORT);
    50  
    51  In the next steps, we'll look at how you can run this app inside a
    52  CentOS container using Docker. First, you'll need to build a Docker
    53  image of your app.
    54  
    55  ## Creating a Dockerfile
    56  
    57  Create an empty file called `Dockerfile`:
    58  
    59      touch Dockerfile
    60  
    61  Open the `Dockerfile` in your favorite text editor
    62  
    63  Define the parent image you want to use to build your own image on
    64  top of. Here, we'll use
    65  [CentOS](https://registry.hub.docker.com/_/centos/) (tag: `centos6`)
    66  available on the [Docker Hub](https://hub.docker.com/):
    67  
    68      FROM    centos:centos6
    69  
    70  Since we're building a Node.js app, you'll have to install Node.js as
    71  well as npm on your CentOS image. Node.js is required to run your app
    72  and npm to install your app's dependencies defined in
    73  `package.json`. To install the right package for
    74  CentOS, we'll use the instructions from the [Node.js wiki](
    75  https://github.com/joyent/node/wiki/Installing-Node.js-
    76  via-package-manager#rhelcentosscientific-linux-6):
    77  
    78      # Enable EPEL for Node.js
    79      RUN     rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
    80      # Install Node.js and npm
    81      RUN     yum install -y npm
    82  
    83  To bundle your app's source code inside the Docker image, use the `COPY`
    84  instruction:
    85  
    86      # Bundle app source
    87      COPY . /src
    88  
    89  Install your app dependencies using the `npm` binary:
    90  
    91      # Install app dependencies
    92      RUN cd /src; npm install
    93  
    94  Your app binds to port `8080` so you'll use the` EXPOSE` instruction to have
    95  it mapped by the `docker` daemon:
    96  
    97      EXPOSE  8080
    98  
    99  Last but not least, define the command to run your app using `CMD` which
   100  defines your runtime, i.e. `node`, and the path to our app, i.e. `src/index.js`
   101  (see the step where we added the source to the container):
   102  
   103      CMD ["node", "/src/index.js"]
   104  
   105  Your `Dockerfile` should now look like this:
   106  
   107      FROM    centos:centos6
   108  
   109      # Enable EPEL for Node.js
   110      RUN     rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
   111      # Install Node.js and npm
   112      RUN     yum install -y npm
   113  
   114      # Bundle app source
   115      COPY . /src
   116      # Install app dependencies
   117      RUN cd /src; npm install
   118  
   119      EXPOSE  8080
   120      CMD ["node", "/src/index.js"]
   121  
   122  ## Building your image
   123  
   124  Go to the directory that has your `Dockerfile` and run the following command
   125  to build a Docker image. The `-t` flag lets you tag your image so it's easier
   126  to find later using the `docker images` command:
   127  
   128      $ docker build -t <your username>/centos-node-hello .
   129  
   130  Your image will now be listed by Docker:
   131  
   132      $ docker images
   133  
   134      # Example
   135      REPOSITORY                          TAG        ID              CREATED
   136      centos                              centos6    539c0211cd76    8 weeks ago
   137      <your username>/centos-node-hello   latest     d64d3505b0d2    2 hours ago
   138  
   139  ## Run the image
   140  
   141  Running your image with `-d` runs the container in detached mode, leaving the
   142  container running in the background. The `-p` flag redirects a public port to
   143  a private port in the container. Run the image you previously built:
   144  
   145      $ docker run -p 49160:8080 -d <your username>/centos-node-hello
   146  
   147  Print the output of your app:
   148  
   149      # Get container ID
   150      $ docker ps
   151  
   152      # Print app output
   153      $ docker logs <container id>
   154  
   155      # Example
   156      Running on http://localhost:8080
   157  
   158  ## Test
   159  
   160  To test your app, get the port of your app that Docker mapped:
   161  
   162      $ docker ps
   163  
   164      # Example
   165      ID            IMAGE                                     COMMAND              ...   PORTS
   166      ecce33b30ebf  <your username>/centos-node-hello:latest  node /src/index.js         49160->8080
   167  
   168  In the example above, Docker mapped the `8080` port of the container to `49160`.
   169  
   170  Now you can call your app using `curl` (install if needed via:
   171  `sudo apt-get install curl`):
   172  
   173      $ curl -i localhost:49160
   174  
   175      HTTP/1.1 200 OK
   176      X-Powered-By: Express
   177      Content-Type: text/html; charset=utf-8
   178      Content-Length: 12
   179      Date: Sun, 02 Jun 2013 03:53:22 GMT
   180      Connection: keep-alive
   181  
   182      Hello world
   183  
   184  If you use Boot2docker on OS X, the port is actually mapped to the Docker host VM,
   185  and you should use the following command:
   186  
   187      $ curl $(boot2docker ip):49160
   188  
   189  We hope this tutorial helped you get up and running with Node.js and
   190  CentOS on Docker. You can get the full source code at
   191  [https://github.com/enokd/docker-node-hello/](https://github.com/enokd/docker-node-hello/).