Today I’d love to share how to wrap a Node microservice or monolithic application inside a Docker container.
I assume that you’ve already installed Docker, boot2docker and Node in your machine.
If you don’t, please check the official Docker page and Node page and after picking your operating system follow the instructions.
I’ve created a simple Node application with Hapi.js that once called returns the classic “hello world” message as response, obviously you can have a way more complex application as well, my main purpose here is talking about how to setup Docker with your Node.js application.
In order to wrap your application inside a Docker container you need to create a Dockerfile, this file is basically defining the setup for the environment where your application will run.
Checking the Docker containers currently available on Docker hub, you can see for Node the official container page that will allow you to pick the right Node version for your application.
As you can see there are many different Node containers available, you can also use other solution like using ubuntu, fedora or centOS as base OS where your node application is going to run but I preferred to use the official one because my server side application doesn’t require any particular configuration.
For this example we are going to use the 5-onbuild that basically is doing the “dirty job” for us, obviously this is a sample application but you can customise your container as you prefer.
What the onbuild version is doing is basically:
- creating a directory of the application inside the container
- copying package.json in that folder
- running “npm install” command
- running “npm start” command
It’s fundamental to define inside the package.json all the dependencies and the start script otherwise the application is not going to work inside the container.
Inside our Dockerfile we are going to write:
FROM node:5-onbuild EXPOSE 8080
So basically we are inheriting all the steps described above regarding the onbuild Dockerfile plus we are exposing the port 8080 that is the one used by our Node application:
const server = new Hapi.Server(); server.connection({ port: 8080 });
It’s a best practice for any Dockerfile starting always with a FROM command and reusing the images that are already created by the community on Docker hub so remember when you want to try something different check always what’s available on Docker hub.
Good so now let’s package our container and try if it works correctly.
In order to build the container we’ll need to run the following command:
docker build -t <username>/<applicationName> .
Basically here we are saying to docker to dockerize the entire folder application (dot at the end of the command) and the container will be called <userName>/<applicationName>
This is another Docker best practice, potentially you can call your container as you prefer but a pattern is adding first your Docker username then slash (“/”) then your application name:
docker build -t lucamezzalira/docker-hapi .
Not let’s try if it works:
docker run -p 49160:8080 -d lucamezzalira/docker-hapi
With this command we are running our container, therefore our Node application, mapping the port 8080 of the container to the port 49160 of the host.
You can check easily if the application is working correctly just typing docker ps in your console, you should see something like that:
So now, because I’m working on Mac, I need to retrieve the boot2docker IP and check if in the port 49160 I’m able to see my hello world application up and running.
In order to do that I’ll run the command:
boot2docker ip
That should return the external IP where my application is running, you can also see which is the container IP using the command:
docker inspect CONTAINER ID (for example: docker inspect afb5810152f6)
The container ID is easily retrievable via docker ps (first column in the picture above).
This command will return a JSON file with a lot of information related to the container.
So now that I’ve the IP where my application is running and the related port I can type inside my bowser the address and see the result!
Obviously you can also map that IP to etc/hosts file adding something more meaningful like boot2docker or whatever name your think is more appropriate!
If you want to download from Docker hub the container I’ve prepared for this post just type:
docker pull lucamezzalira/docker-hapi
This is a very basic introduction to Docker world and Node, I’m working on a sample microservices application that will involve few interesting concepts and pattern, so keep an eye on this blog😉
