mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
853c5e258f
the address of epel rpm has change to http://dl.fedoraproject....
239 lines
6.1 KiB
ReStructuredText
239 lines
6.1 KiB
ReStructuredText
: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://dl.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. The ``-p`` flag redirects a public port to a private port in the container. Run the image you previously built:
|
||
|
||
.. code-block:: bash
|
||
|
||
sudo docker run -p 49160:8080 -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/
|