TL;DR. With a physical/virtual machine, you program for an operating system. With an application machine, you program for a container runtime.
With all the confusion as to the real nature of containers, let me set the record straight.
A container, like the physical phenomenon called light, exhibits dual nature. That of an application and that of a machine.
It is not a machine in the sense of a physical or virtual machine.
It is not an application in the sense of an application on top of an operating system.
Let’s just say, a container is an intersection of a machine and an application, and I will dub it as an application machine.
When I say a container is like a machine, I am referring to containers as exhibiting features like having its own IP address and optional ports regardless if it has an OS inside or not.
A container is neither an app nor a machine. It is an application machine.
Just as byte code runs on top of a JVM, Python VM and whatnot, a container runs on top of a Linux 3.10+ kernel and being managed by the Golang runtime embedded in Docker.
Historically, hypervisors were invented in part because you want to cram more virtual machines onto a physical machine. With a VM, you still program on top of an operating system. The VMs become portable machines.
In contrast, with containers you cram more application machines onto a physical machine. With a container, you still program on top of an operating system but this time, you program on top of an OCI-compatible Linux kernel. Containers become portable machines but in the app machine sense.
Implications of Containers (or Application Machines)
- configuration management (CM) is relegated to managing the physical and/or virtual machine where the container runtime is installed
- if you run a virtualization environment like Proxmox, it is also relegated to the same role as above
- with containers, Dockerfile and the build process assume the CM of the container
- more of these at this post (container vs configuration management)
- a container is just one way of doing things, using a virtual machine is another. Let’s just say container vs VM is the computing version of AC vs DC debate. Bring it on!