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