Est-il possible de lancer docker depuis l’intérieur du docker?

Je lance Jenkins dans un conteneur Docker. Je me demande si le conteneur Jenkins peut aussi être un hôte Docker? Ce que je pense, c’est de lancer un nouveau conteneur Docker pour chaque build de test d’intégration depuis Jenkins (pour démarrer des bases de données, des courtiers de messages, etc.). Les conteneurs doivent donc être arrêtés une fois les tests d’intégration terminés. Y a-t-il une raison d’éviter d’exécuter des conteneurs de docker à partir d’un autre conteneur Docker de cette manière?

Bien que possible, lancer Docker à l’intérieur de Docker (alias dind ) doit être évité, si possible. (Source fournie ci-dessous.) Au lieu de cela, vous souhaitez configurer un moyen pour votre conteneur principal de produire et de communiquer avec des conteneurs frères .

Jérôme Petazzoni – l’auteur de la fonctionnalité qui a permis à Docker de fonctionner dans un conteneur Docker – a en fait écrit un article de blog disant de ne pas le faire . Le cas d’utilisation qu’il décrit correspond au cas d’utilisation exact d’un conteneur Docker CI qui doit exécuter des tâches dans d’autres conteneurs Docker.

Petazzoni énumère deux raisons pour lesquelles Dind est gênant:

  1. Il ne coopère pas bien avec les modules de sécurité Linux (LSM).
  2. Cela crée une incohérence dans les systèmes de fichiers, ce qui crée des problèmes pour les conteneurs créés dans les conteneurs parents.

À partir de cet article, il décrit l’alternative suivante:

Le moyen le plus simple est de simplement exposer le socket Docker à votre conteneur CI, en le liant avec le drapeau -v .

Autrement dit, lorsque vous démarrez votre conteneur CI (Jenkins ou autre), au lieu de pirater quelque chose avec Docker-in-Docker, lancez-le avec:

 docker run -v /var/run/docker.sock:/var/run/docker.sock ... 

Maintenant, ce conteneur aura access au socket Docker et pourra donc démarrer des conteneurs. Sauf qu’au lieu de démarrer les conteneurs “enfants”, il va commencer les conteneurs “frères”.

J’ai déjà répondu à une question similaire sur la façon d’exécuter un conteneur Docker dans Docker .

Docker à l’intérieur de docker est certainement possible. L’essentiel est que vous --privileged=true le conteneur externe avec des privilèges supplémentaires (en commençant par --privileged=true ), puis installez docker dans ce conteneur.

Consultez cet article pour plus d’informations: Docker-in-Docker .

Un cas d’utilisation potentiel est décrit dans cette entrée . Le blog explique comment créer des conteneurs Docker dans un conteneur Docker Jenkins.

Cependant, Docker dans Docker n’est pas l’approche recommandée pour résoudre ce type de problèmes. Au lieu de cela, l’approche recommandée consiste à créer des conteneurs “frères” comme décrit dans cet article.

Ainsi, l’exécution de Docker à l’intérieur de Docker était considérée par beaucoup comme un bon type de solution pour ce type de problèmes. Maintenant, la tendance est d’utiliser des conteneurs “frères” à la place. Voir la réponse de @predmijat sur cette page pour plus d’informations.