123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- :title: Running a Node.js app on CentOS
- :description: Installing and running a Node.js app on CentOS
- :keywords: docker, example, package installation, node, centos
- .. _nodejs_web_app:
- Node.js Web App
- ===============
- .. include:: example_header.inc
- The goal of this example is to show you how you can build your own
- Docker images from a parent image using a ``Dockerfile`` . We will do
- that by making a simple Node.js hello world web application running on
- CentOS. You can get the full source code at
- https://github.com/gasi/docker-node-hello.
- Create Node.js app
- ++++++++++++++++++
- First, create a ``package.json`` file that describes your app and its
- dependencies:
- .. code-block:: json
- {
- "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"
- }
- }
- Then, create an ``index.js`` file that defines a web app using the
- `Express.js <http://expressjs.com/>`_ framework:
- .. code-block:: javascript
- 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);
- In the next steps, we’ll look at how you can run this app inside a CentOS
- container using Docker. First, you’ll need to build a Docker image of your app.
- Creating a ``Dockerfile``
- +++++++++++++++++++++++++
- Create an empty file called ``Dockerfile``:
- .. code-block:: bash
- touch Dockerfile
- Open the ``Dockerfile`` in your favorite text editor and add the following line
- that defines the version of Docker the image requires to build
- (this example uses Docker 0.3.4):
- .. code-block:: bash
- # DOCKER-VERSION 0.3.4
- Next, define the parent image you want to use to build your own image on top of.
- Here, we’ll use `CentOS <https://index.docker.io/_/centos/>`_ (tag: ``6.4``)
- available on the `Docker index`_:
- .. code-block:: bash
- FROM centos:6.4
- Since we’re building a Node.js app, you’ll have to install Node.js as well as
- npm on your CentOS image. Node.js is required to run your app and npm to install
- your app’s dependencies defined in ``package.json``.
- To install the right package for CentOS, we’ll use the instructions from the
- `Node.js wiki`_:
- .. code-block:: bash
- # 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
- To bundle your app’s source code inside the Docker image, use the ``ADD``
- instruction:
- .. code-block:: bash
- # Bundle app source
- ADD . /src
- Install your app dependencies using the ``npm`` binary:
- .. code-block:: bash
- # Install app dependencies
- RUN cd /src; npm install
- Your app binds to port ``8080`` so you’ll use the ``EXPOSE`` instruction
- to have it mapped by the ``docker`` daemon:
- .. code-block:: bash
- EXPOSE 8080
- Last but not least, define the command to run your app using ``CMD``
- which defines your runtime, i.e. ``node``, and the path to our app,
- i.e. ``src/index.js`` (see the step where we added the source to the
- container):
- .. code-block:: bash
- CMD ["node", "/src/index.js"]
- Your ``Dockerfile`` should now look like this:
- .. code-block:: bash
- # 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"]
- Building your image
- +++++++++++++++++++
- Go to the directory that has your ``Dockerfile`` and run the following
- command to build a Docker image. The ``-t`` flag let’s you tag your
- image so it’s easier to find later using the ``docker images``
- command:
- .. code-block:: bash
- sudo docker build -t <your username>/centos-node-hello .
- Your image will now be listed by Docker:
- .. code-block:: bash
- sudo docker images
- > # Example
- > REPOSITORY TAG ID CREATED
- > centos 6.4 539c0211cd76 8 weeks ago
- > gasi/centos-node-hello latest d64d3505b0d2 2 hours ago
- Run the image
- +++++++++++++
- Running your image with ``-d`` runs the container in detached mode, leaving the
- container running in the background. Run the image you previously built:
- .. code-block:: bash
- sudo docker run -d <your username>/centos-node-hello
- Print the output of your app:
- .. code-block:: bash
- # Get container ID
- sudo docker ps
- # Print app output
- sudo docker logs <container id>
- > # Example
- > Running on http://localhost:8080
- Test
- ++++
- To test your app, get the the port of your app that Docker mapped:
- .. code-block:: bash
- sudo docker ps
- > # Example
- > ID IMAGE COMMAND ... PORTS
- > ecce33b30ebf gasi/centos-node-hello:latest node /src/index.js 49160->8080
- In the example above, Docker mapped the ``8080`` port of the container to
- ``49160``.
- Now you can call your app using ``curl`` (install if needed via:
- ``sudo apt-get install curl``):
- .. code-block:: bash
- 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
- We hope this tutorial helped you get up and running with Node.js and
- CentOS on Docker. You can get the full source code at
- https://github.com/gasi/docker-node-hello.
- Continue to :ref:`running_redis_service`.
- .. _Node.js wiki: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager#rhelcentosscientific-linux-6
- .. _docker index: https://index.docker.io/
|