С выпуском версии v0.9 Docker представил собственную среду выполнения, известную как libcontainer. Эта библиотека написана на Go, на том же языке программирования, что и сам Docker, и это снизило зависимость Docker от технологии LXC. Благодаря libcontainer Docker теперь мог напрямую взаимодействовать с функциями ядра Linux, которые реализуют пространства имен и группы безопасности. Таким образом, libcontainer полностью вытеснил LXC в качестве среды исполнения контейнеров для Docker.

До начала 2015 года не существовало стандартов или рекомендаций для контейнерного программного обеспечения. Каждая система реализовывала своё видение контейнеризации, сетей и управления этим. Инициатива открытых контейнеров или OCI была сформирована Docker, CoreOS и другими лидерами отрасли с целью создания неких отраслевых стандартов или рамок для формата контейнера и среды исполнения контейнеров. Таким образом было сформированы две OCI-спецификации: runtime-spec и image-spec.

Спецификация runtime определила жизненный цикл контейнера. Там было зафиксировано, что команда create должна создавать контейнер, команда start должна запускать контейнер, команда delete должна удалять контейнер и так далее. В этой спецификации определено гораздо больше стандартов, и ты можешь посмотреть их онлайн в репозитории на GitHub.

До этого времени демон Docker представлял собой приложение с монолитным кодом, который выполнял множество функций, таких как запуск и управление контейнерами, управление сетями, томами, образами на docker-хосте, функциями для отправки и получения образов из docker-репозиториев. С появлением стандартов OCI архитектура движка Docker была переработана. Он был разделен на более мелкие компоненты. С версии v1.11 появилась часть, которая занималась только запуском контейнеров. Это стал первый независимый компонент, известный как Run Containers (runC). RunC была первой технологией, основанной на OCI, и Docker передал её в дар фонду Linux Foundation.