web-dev-qa-db-fra.com

Est-il possible d'exécuter le menu fixe à partir du menu fixe?

J'exécute Jenkins dans un conteneur Docker. Je me demande si le conteneur Jenkins est également un hôte Docker? Ce que je pense, c'est de démarrer un nouveau conteneur Docker pour chaque construction de test d'intégration à partir de 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 de faire fonctionner les conteneurs Docker depuis un autre conteneur Docker de cette manière?

141
Johan

Exécuter Docker dans Docker (a.k.a. dind ) doit être évité, dans la mesure du possible. (Source fournie ci-dessous.) Au lieu de cela, vous souhaitez configurer un moyen pour que votre conteneur principal produise et communique avec des conteneurs frères .

Jérôme Petazzoni - l'auteur de la fonctionnalité qui permettait à Docker de s'exécuter dans un conteneur Docker - écrivait en fait n 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 incompatibilité dans les systèmes de fichiers, ce qui crée des problèmes pour les conteneurs créés dans les conteneurs parents.

À partir de ce blog, il décrit l’alternative suivante:

[La] méthode la plus simple consiste à exposer simplement le socket Docker à votre conteneur CI en le montant avec l’indicateur -v.

En termes simples, lorsque vous démarrez votre conteneur CI (Jenkins ou autre), au lieu de pirater quelque chose avec Docker-in-Docker, commencez-le par:

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

Maintenant, ce conteneur aura accès au socket Docker et pourra donc démarrer des conteneurs. Sauf qu'au lieu de démarrer des conteneurs "enfants", il lancera des conteneurs "frères".

169
predmijat

J'ai déjà répondu à une question similaire sur comment utiliser un conteneur Docker dans Docker .

Exécuter docker à l'intérieur de docker est certainement possible. L'essentiel est que vous run le conteneur externe avec privilèges supplémentaires (à partir de --privileged=true), puis que vous installiez le menu fixe dans ce conteneur.

Vérifiez ce billet de blog pour plus d’informations: Docker-in-Docker .

Un cas d'utilisation potentiel pour cela est décrit dans cette entrée . Le blog explique comment créer des conteneurs de docker dans un conteneur de 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, exécuter Docker dans Docker a été considéré par beaucoup comme un bon type de solution pour ce type de problèmes. Maintenant, la tendance est d’utiliser plutôt des conteneurs "frères". Voir la réponse de @predmijat sur cette page pour plus d'informations.

46
wassgren