https://github.com/opencontainers/runtime-spec/blob/master/i... https://github.com/opencontainers/image-spec/blob/master/imp...
There have been a few iterations of the container concept. First there were things like Solaris Zones and FreeBSD Jails. Then Google added CGroups to the Linux kernel, which are a basic way of grouping processes together for resource accounting and limiting purposes. Then all of the OS resources in Linux got namespaced (so you can't see things outside of your namespace, like devices, mounted filesystems, process ids, etc). LXC was the first container implementation using cgroups and namespaces in the mainline Linux kernel. Docker initially built on top of this, but eventually made their own implementation (libcontainer). Then there were some competing implementations (rkt, maybe others I'm forgetting), and so everyone decided to sit down and agree on a common spec, and so the Open Containers Initiative was born. This was mainly to ensure that no single company had complete control over container designs, and that containers would be interoperable between runtime implementations. Docker built runC, a runtime that complies with the OCI spec, and then rebuilt the rest of their application around it. Basically any new container implementation is likely to conform to the OCI spec.