88 votes

Rôle du service docker-in-docker (dind) dans gitlab ci

Selon le fonctionnaire documentation gitlab une façon de permettre docker build sur ci consiste à utiliser l'option dind service (en termes de gitlab-ci services ).

Toutefois, comme c'est toujours le cas avec les travaux ci s'exécutant sur des exécuteurs Docker, l'option docker:latest est également nécessaire.

Quelqu'un pourrait-il expliquer :

  • quelle est la différence entre le docker:dind et le docker:latest des images ?
  • (le plus important) : pourquoi sont les deux le service et l'image docker nécessaire (par exemple comme indiqué dans cet exemple dont le lien se trouve dans la documentation github) pour effectuer par exemple un docker build dans le cadre d'un travail de fonctionnaire ? Est-ce que la docker:latest image ( dans lequel le travail sera exécuté !) intègrent le démon docker (et je pense que les docker-compose également), qui sont les outils nécessaires pour les commandes dont nous avons besoin (par ex. docker build , docker push etc.) ?

Sauf erreur de ma part, la question est plus ou moins la suivante :

Pourquoi un client Docker et un démon Docker ne peuvent-ils pas résider dans le même conteneur Docker (activé) ?

99voto

saraedum Points 524

quelle est la différence entre les images docker:dind et docker:latest ?

  • docker:latest contient tout ce qui est nécessaire pour se connecter à un démon Docker, c'est-à-dire pour exécuter docker build , docker run et autres. Il contient également le démon docker, mais il n'est pas lancé comme point d'entrée.
  • docker:dind s'appuie sur docker:latest et lance un démon docker comme point d'entrée.

Ainsi, leur contenu est presque le même mais à travers leurs points d'entrée, on est configuré pour se connecter à tcp://docker:2375 comme un client tandis que l'autre est destiné à être utilisé comme un démon.

pourquoi le service et l'image docker sont-ils tous deux nécessaires [ ] ?

Vous n'avez pas besoin des deux. Tu peux juste utiliser l'un ou l'autre, commencer dockerd dans un premier temps, puis exécutez votre docker build et docker run les commandes comme d'habitude, comme je l'ai fait ici ; apparemment, c'était l'approche originale dans gitlab à un moment donné . Mais je trouve plus propre d'écrire simplement service: docker:dind au lieu d'avoir un before_script pour mettre en place dockerd . De plus, vous n'avez pas besoin de comprendre comment démarrer et installer dockerd correctement dans votre image de base (si vous n'utilisez pas docker:latest .)

Déclarer le service dans votre .gitlab-ci.yml vous permet également d'échanger facilement le docker-in-docker si vous savez que votre runner monte son /var/run/docker.sock dans votre image. Vous pouvez définir les variable protégée DOCKER_HOST à unix:///var/run/docker.sock pour obtenir des constructions plus rapides. Les autres personnes qui n'ont pas accès à un tel runner peuvent toujours bifurquer vers votre dépôt et se rabattre sur l'option dind sans modifier votre .gitlab-ci.yml .

1 votes

Pour compléter le message de @saraedum, si je ne me trompe pas, si vous spécifiez l'adresse de l'ordinateur de l'utilisateur, il est possible de l'utiliser. DOCKER_HOST var pour être ce que le service attend, ce qui, je pense, est DOCKER_HOST: "tcp://${DOCKER_REGISTRY}__library__docker:2375" (et vous le faites pas le monter sur le socket de l'hôte), cela va désactiver mise en cache de la couche docker (juste une remarque sur les différences réelles entre l'utilisation et la non-utilisation du service).

4 votes

Merci pour cette excellente explication ! Une question complémentaire, si la seule différence est docker:dind a lancé le démon docker comme point d'entrée, pourquoi ne pouvons-nous pas utiliser docker:dind directement en tant qu'image ? Est-ce parce que dans le docker:dind il est également configuré pour se connecter à tcp://docker:2375 insteand of tcp://localhost:2375 ?

-5voto

Fiber Optic Points 95

Le conteneur ne contiendra que les éléments définis dans une image docker. Vous savez que vous pouvez installer n'importe quoi, à partir d'une image de base. Mais vous pouvez également installer Docker (deamon et client) dans un conteneur, c'est-à-dire un Docker DANS Docker (dind). Ainsi, le conteneur pourra faire tourner d'autres conteneurs. C'est pourquoi gitlab en a besoin.

1 votes

Oui, mais en quoi le conteneur dind a-t-il quelque chose à voir avec le conteneur docker:latest ? S'exécute-t-il à l'intérieur de celui-ci ? La seule explication de gitlab est que les services peuvent être utilisés pour faire tourner et lier des conteneurs auxiliaires comme une base de données par exemple. Je ne vois pas en quoi le fait d'avoir un conteneur dind disponible et lié changerait quelque chose.

0 votes

Oui docker est installé dans l'image dind. Quel est votre problème exactement ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X