Containers are simply a collection of "development code + depenencies". This is the same as saying that containers are a collection of "executable application + the dependencies".
A container runs on top of a container-runtime.
The container-runtime runs on top of the Kernel/OS/Hardware.
Contrast this with Hypervising setup.