L’évolution de la conteneurisation, de 1979 à aujourd’hui

Thomas SCHWENDER

Disclaimer

Ce talk n’a PAS vocation à expliquer les commandes Docker, Kubernetes ou celles d’un quelconque container runtime 🙂

Mais c’est quoi un conteneur aujourd’hui ?

La même chose qu’hier ! 😉
Tout simplement un groupe de processus isolés les uns des autres par un certain moyen.

Les années 70s, les prémices de la conteneurisation

L’idée originale de conteneur a germé dans les années 70s sur les systèmes Unix, quand l’on a eu besoin de mieux isoler le code applicatif.

A cette époque les ordinateurs étaient très chers et donc très rares, il fallait donc pouvoir les exploiter au maximum.

1972 Unix Ken Thompson Dennis Ritchie PDP 11
Ken Thompson et Dennis Ritchie, inventeurs d’UNIX, devant un PDP-11 vers 1972

1979 - grande étape : chroot

L’appel système chroot a été créé en 1979, pendant le développement de la version 7 d’Unix.

chroot permet de changer le répertoire racine d’un processus et de ses enfants.

Cela a marqué le début de l'isolation des processus, en restreignant l’accès d’une application à une arborescence de fichiers données.

chroot example

La sécurité s’en voit renforcée, l’environnement isolé ne permettant théoriquement pas à une attaque de "sortir" sur un système extérieur.

2000/03 : FreeBSD Jails

Jails permet de partitionner un système FreeBSD en sous-systèmes indépendants, appelés "jails", avec la possibilité d’assigner à chacun d’eux une adresse IP spécifique.

FreeBSD jails example

2001 : Linux VServer

Comme FreeBSD Jails, Linux VServer est un mécanisme de "prison".

Il permet de partitionner des ressources (systèmes de fichiers, adresses réseau, mémoire) au sein de l’OS, via l’ajout de capacités de virtualisation de l’OS au noyau Linux.

Linux VServer logo

Son principal inconvénient était qu’il imposait de patcher le noyau Linux.

2002/08 : 1ers Linux namespaces

Les namespaces sont une fonctionnalité du noyau Linux permettant à vos processus d’être séparés des autres processus tournant sur l’OS.

Ils permettent aux processus de disposer chacun de leurs propres ressources : réseau, PID, utilisateurs, hostname, mounts, etc.

Les namespaces "limitent ce que l’on peut voir"

linux namespace schema
julia evans how containers work 12 how to make a namespace
Julia Evans zine "How Containers work!", focus on namespaces

mount namespaces

Le 1er type de namespaces à avoir été ajouté au noyau Linux, en version 2.4.19, est les mount namespaces le 2002/08/03.

mount namespaces description
Jérôme Petazzoni (Docker), DockerCon 2015

2003 : Google présente Borg

Borg était l'orchestrateur de conteneurs (container cluster management system) utilisé en interne par Google.

Il était basé sur les mécanismes d’isolation déjà présents sur Linux et pouvait exécuter des milliers de jobs, en provenance de milliers d’applications, au travers d’un grand nombre de clusters chacun composé de dizaines de milliers de machines…​

borg high level architecture

2004 : Solaris containers

En 2004, pour Solaris 10, était publiée la 1ere beta publique des Solaris Containers, qui combinaient contrôle des ressources du système et définition de frontières, à l’aide du concept de zones.

Ces zones agissent comme autant de serveurs virtuels totalement isolés, au sein d’une seule instance d’OS.

solaris containers zones

2005 : OpenVZ

OpenVZ est une technologie de virtualisation de niveau système d’exploitation pour Linux, basé sur une version modifiée de son noyau.

Ce dernier apporte les fonctionnalités de virtualisation, d’isolement, de gestion de ressources, et de checkpointing.

openvz architecture

OpenVZ permet à un serveur physique d’exécuter de multiples instances de systèmes d’exploitation isolés, qualifiées de serveurs privés virtuels (VPS) ou environnements virtuels (VE).

2006 : début des travaux sur les Process Containers chez Google

Ces derniers, développés par Paul Menage et Rohit Seth, seront rapidement renommés en cgroups (control groups), et sont, avec les namespaces, les fonctionnalités du noyau Linux ayant eu le plus d’importance pour le développement des conteneurs.

Les cgroups sont une fonctionnalité du noyau Linux permettant de limiter, quantifier et isoler l’utilisation de ressources d’une collection de processus (CPU, mémoire, réseau, etc.).

cgroups schema

Ils permettent de regrouper des processus, et de s’assurer que chaque groupe puisse récupérer sa part de mémoire, CPU, réseau, etc. afin qu'aucun groupe ne puisse monopoliser certaines ressources.

julia evans how containers work 10 cgroups
Julia Evans zine "How Containers work!", focus on cgroups

Les cgroups limitent "COMBIEN on peut utiliser", là où les namespaces limitent "ce que l’on peut voir".

2007/10 : 1eres briques de l’implémentation des user namespaces

Eric Biederman développe ces 1eres briques qu’il ajoute à la version 2.6.23 du noyau Linux.

Les user namespaces sont les namespaces les plus complexes et les plus importants pour le fonctionnement de la conteneurisation.

Ils permettent à un processus d’avoir ses propres utilisateurs, et de disposer des droits root dans un conteneur, mais PAS à l’extérieur.

user namespaces explanation
julia evans how containers work 14 user namespaces

2008/01 - grande étape

Ajout de la fonctionnalité des cgroups dans la version 2.6.24 du noyau Linux.

2008/08 - grande étape

Création du projet "Linux Containers" (LXC) par des ingénieurs d’IBM.

Les Linux Containers ont été la 1ere véritable implémentation d’une gestion de conteneurs pour Linux.

Ils s’appuient sur les cgroups et les Linux namespaces, et fonctionnent sur un noyau Linux non patché.

Linux Container Architecture

2011 : Warden

Projet lancé par CloundFoundry, Warden s’appuyait à la base sur LXC.

Il avait pour but de fournir moyen simple de gérer des environnements isolés (des conteneurs 😉)

Pour se faire, il tournait comme un daemon, et proposait une API de gestion de conteneurs.

warden architecture

2013/02 : grande étape

Ajout de la 1ere "version complète" des user namespaces au kernel Linux 3.8

Solomon Hykes l’a affirmé lors de son tout premier talk de présentation Docker, c’est la sortie de ces user namespaces "qui marchent maintenant", qui a rendu Docker possible.

On a maintenant tout pour créer des conteneurs ! 🙂

Avec les cgroups, les namespaces, ainsi que quelques autres fonctionnalités du noyau Linux (pivot_root, seccomp-bpf, capabilities), nous avons tout pour créer des conteneurs, y compris "à la main"

julia evans how containers work 3 containers arent magic

2013/02 - étape majeure : 1ere release de Docker

Docker a fourni un wrapping simple et facile d’utilisation des fonctionnalités d’isolation de processus du noyau Linux.

C’est cette facilité d’usage qui a permis l’explosion de popularité des conteneurs.

Docker architecture 2013

Pour Solomon Hykes, la raison d’être de Docker était de pouvoir systématiquement livrer ("shipper") une application "de A à B" de façon fiable et automatique, sans avoir de question à se poser.

Hésitations et craintes côté sécurité

vms vs containers

Chronologie

TODO : ajouter ici un screenshot de la chronologie sur Timetoast

Ressources

Des questions ?

Merci !