Have you heard of Docker? Or maybe containers? If you’ve been in software the past few years, you probably have.
There also might be a chance that you have no idea what these technologies are. Or you might know what they are but have no clue why you would use them. Or worse — you might be at a company going through a “DevOps transformation” being forced to use these technologies, and no one can tell you why.
The fact is that containers are an incredible technology that brings many exciting benefits to development. They introduce some new challenges too. Deciding to go all-in on containers isn’t one to be made lightly. You need to understand what containers are, how they work, and if they are right for your team.
Let’s dive into some of the details behind containers and what’s the point in using them.
What is a Container?
Containers in software are like a shipping container (hence the name Docker — which we will get to later). They are essentially a “mini-computer” encapsulated into a single file. These files are called images. These images get executed by running them on container engines — also called container runtime engines. A running image is called the container.
To go a bit deeper, a container allows a team to package software assets, dependencies, code runtimes, and other tools into the container image. The result is that instead of having to install those items onto servers individually or via a server management tool (think Ansible, Puppet, Vagrant), a single file controls all of the details about what your application needs to run. This ability to package everything into a single file makes the image portable — one of the top benefits of containers.
But you might be thinking — doesn’t the software need an operating system? How does the application in the image know how to interact with the operating system? These are great questions!
For this article, the answer is that containers take advantage of operating system-level virtualization. The container engine abstracts the specific operations system away but allows system calls from the application to “pass-through” to the OS. While that is simple in theory, many interesting kernel abilities exist to provide…