J'exécute Jenkins dans un conteneur Docker. Je me demande s'il est acceptable que le conteneur Jenkins soit également un hôte Docker? Ce à quoi je pense, c'est de démarrer un nouveau conteneur de 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 Docker à partir d'un autre conteneur Docker de cette manière?
jenkins
docker
docker-dind
Johan
la source
la source
Réponses:
L'exécution de Docker dans Docker (alias dind ), bien que possible, doit être évitée, dans la mesure du 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 s'exécuter 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 de l'OP d'un conteneur CI Docker qui doit exécuter des tâches dans d'autres conteneurs Docker.
Petazzoni énumère deux raisons pour lesquelles la dind est gênante:
À partir de ce billet de blog, il décrit l'alternative suivante,
la source
sudo
faire comme ça? Mercidocker
groupe:sudo usermod -aG docker $USER
. Vous devrez vous reconnecter après cela./var/run/docker.sock
où vous exécutez docker pour mac sur votre machine macos./var/run/docker.sock
J'ai déjà répondu à une question similaire sur la façon d'exécuter un conteneur Docker dans Docker .
Ainsi, exécuter Docker dans Docker était par beaucoup considéré 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.
la source
Il est possible d'exécuter Docker-in-Docker (DinD) et en fait Docker (la société) a une image DinD officielle pour cela.
La mise en garde cependant est qu'il nécessite un conteneur privilégié, qui en fonction de vos besoins de sécurité peut ne pas être une alternative viable.
La solution alternative d'exécuter Docker à l'aide de conteneurs frères (aka Docker-out-of-Docker ou DooD) ne nécessite pas de conteneur privilégié, mais présente quelques inconvénients qui découlent du fait que vous lancez le conteneur à partir d'un contexte qui est différent de celui dans lequel il s'exécute (c'est-à-dire que vous lancez le conteneur depuis un conteneur, mais il s'exécute au niveau de l'hôte, pas à l'intérieur du conteneur).
J'ai écrit un blog décrivant les avantages / inconvénients de DinD vs DooD ici .
Cela dit, Nestybox (une startup que je viens de fonder) travaille sur une solution qui exécute un véritable Docker-in-Docker en toute sécurité (sans utiliser de conteneurs privilégiés). Vous pouvez le consulter sur www.nestybox.com .
la source
Oui, nous pouvons exécuter docker dans le docker, nous devrons attacher le sockeet unix "/var/run/docker.sock" sur lequel le démon docker écoute par défaut en tant que volume le docker parent en utilisant "-v / var / run /docker.sock:/var/run/docker.sock ". Parfois, des problèmes de permissions peuvent survenir pour le socket du démon docker pour lequel vous pouvez écrire "sudo chmod 757 /var/run/docker.sock".
Et il faudrait également exécuter le docker en mode privilégié, de sorte que les commandes seraient:
sudo chmod 757 /var/run/docker.sock
docker run --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...
la source