As some of the most innovative companies like Oculus and Gilt Groupe jump into Docker containers, more and more base images appear on Docker Hub that can be used to containerize your applications. With this said most of these Docker images has one or more of the following issues:
- big in size
- strange / non-existent versioning
- mutable tags
- unmaintained
We are happy to release our Alpine-based Node.js Docker images that try to solve those pain points. In this article, you will learn about why we went with Alpine, how we version our images and how you can start building applications using them today.
Meet Alpine Linux
Alpine Linux is a Linux distribution based on musl and BusyBox, primarily designed for “power users who appreciate security, simplicity and resource efficiency”. It uses PaX and grsecurity patches in the default kernel and compiles all userspace binaries as position-independent executables with stack-smashing protection.
Lately, rumors arose that even Docker, Inc is planning to move its infrastructure from Ubuntu to Alpine.
Versioning our Docker Images
At first, it may seem strange how we versioned our Alpine-based docker images – let me explain.
Each tag that we released and going to release has the following format: [linux-version]-[node-version]-[project-version]
. So if you see something like this: 3.3-v4.2.6-1.1.3
then that means that you are going to use 3.3 of the given Linux distribution, v4.2.6 of Node.jsNode.js is an asynchronous event-driven JavaScript runtime and is the most effective when building scalable network applications. Node.js is free of locks, so there's no chance to dead-lock any process. and the project that generated the image is at 1.1.3. You may wonder: why do we need the project version? As we love immutable deployments we believe that Docker tags should be immutable as well – we achieve this immutability by appending that extra version number.
The reason for this is the following: if dependent package that’s not related to the operation system nor Node.js itself directly (like a security update) we bump the package version number.
Dockerizing Your Node.js Application
Once you have Docker installed on your computer containerizing your application is straightforward.
First, you have to create a Dockerfile
.
Once you have it simply copy-paste the following code snippet:
So far so good – but what’s going on here? We just copy our package.json
into the image, then run npm install
then copy the rest. These copy steps are done separately because Docker works using layers that can be cached. So if our package.json does not change, Docker doesn’t need to install the dependencies on each build saving us a lot of time.
Next up
In the coming weeks, you will see more articles on how can you use Docker containers with Node.js and microservicesMicroservices are not a tool, rather a way of thinking when building software applications. Let's begin the explanation with the opposite: if you develop a single, self-contained application and keep improving it as a whole, it's usually called a monolith. Over time, it's more and more difficult to maintain and update it without breaking anything, so the development cycle may... on the blog. To be notified, subscribe to our newsletter!