Containers are software packages that provide an entire runtime environment: an application, plus its dependencies, system libraries, settings and other binaries, and the configuration files needed to run it. Available for both Linux and Windows, containerized apps will always run the same, regardless of the environment. Containers isolate software from its surroundings and help reduce conflicts between IT teams running different software on the same infrastructure. Containers are a solution to the problem of running software reliably when moved from one computing environment to another. Whether moving an app from a developer’s laptop to a test environment, from a staging environment into production, from a physical machine to a virtual machine, or from one cloud platform to another, problems can arise when the supporting software environment is not identical. Differences in network topology, security policies, storage and other factors may keep an application from running. Containerizing an application and its dependencies removes the OS distribution variations and underlying infrastructure differences that prevent application migration and system interoperability.
Unlike virtualization, where a software package is a virtual machine that includes an entire operating system and the application, containerized applications share the operating system kernel with other containers. Containers use fewer resources than virtual machines. For example, a physical server running three virtual machines would have a hypervisor and three separate operating systems running on top of it. In contrast, a server running three containerized applications runs a single operating system, and each container shares the OS kernel. A virtual machine with its own full operating system may be several gigabytes in size, versus a container of several megabytes. A single server can host many more containers than virtual machines. Containerized applications start up instantly because they don’t have to boot up an entire OS to begin running the applications. This allows containers to be instantiated “just in time” when needed and retired when they are no longer required, freeing up resources on their hosts.
Containers give developers the ability to create predictable environments that are isolated from other applications. Enterprises use containers to increase DevOps productivity because containers allow IT teams to spend less time debugging and diagnosing differences in environments and more time releasing new functionality. Container management systems like Docker Enterprise Edition or Kubernetes provide mechanisms for deploying, maintaining and scaling containerized applications on enterprise Linux or Windows operating systems and various cloud providers.