A container is a self-contained software artifact that includes an application and all the dependencies necessary for the application to run. A container enables an application to always run in a consistent environment, simplifying deployment.
Today, while “Docker” is virtually synonymous with “containers,” the concept and development of containers existed long before Docker arrived on the technology scene. Unix systems developed and bundled together the important concepts of isolation, such as
jail, which provided the fundamental concepts for container development.
More recently, Solaris introduced container technology in 2004, followed by companies such as OpenVZ, Cloud Foundry, LXC, and Google in 2006. However, Google eventually moved away from its container concepts (“control groups” or
cgroups and LMCTFY) to contribute to the early origins of Docker, which began its rise in 2013.
Virtualization in computer networking began in the 1960s in order to divide resources from the mainframe computer among other applications. Since then, the practice became widely used by IT teams in order to maximize the efficiency of what could be done with only a few physical machines.
In general, virtualization takes all of the hardware, resources, and operating systems needed to run a computer, and turns them into virtual abstractions. But even this practice required physical space, physical machines, and a significant amount of resources. Enter the container.
Containerization evolved from virtual machines by dividing a single operating system into several different user-spaces, on which a running application thinks it is in an isolated computing environment. So while virtual machines affect an entire environment (operating system, hardware, resources), a container only affects the division of the operating system.
- Containers are an abstraction that groups a software package into a single, isolated unit that’s “ready to go.”
- Containers allow developers to test, run, and deploy applications on any machine, regardless of environment, host, or available resources.
- They are cost-effective, modular, and resource-efficient compared to virtual machines.
- They fit into the microservices architecture as they are modular and isolated and do not affect one another.
Cloud-native applications today are typically polyglot applications. NodeJS may be used for UI services, while Golang or Java may be used for backend services. Moreover, each service may rely on different libraries, databases, or other other additional infrastructure. Containers provide a common environment to package and deploy applications, no matter the language or dependency environment.