DIND : Docker In Docker
Docker-in-Docker (DinD) est une technique permettant d'exécuter une instance de Docker à l'intérieur d'un conteneur Docker.
Cela signifie que vous pouvez utiliser Docker pour gérer des conteneurs à l'intérieur d'un conteneur Docker. DinD est couramment utilisé dans les environnements d'intégration continue (CI) pour automatiser la construction, le test et le déploiement des conteneurs Docker.
Contexte
Le pipeline GitLab CI doit envoyer une image Docker (nginx pour l'exemple) vers un registre Harbor.
Erreur rencontrée
Lors d'un test dans GITLAB CI, une erreur s'est produire durant l'éxecution d'un job sur un pipeline :
Server:
ERROR: error during connect: Get "http://docker:2375/v1.46/info": dial tcp: lookup docker on 8.8.8.8:53: no such host
errors pretty printing info
ERROR: Job failed: exit code 1
Pipeline
Avant l'erreur, voici le fichier gitlab-ci.yml :
# PIPELINE vers harbor
stages:
- build
variables:
HARBOR_REGISTRY: registry.domaine.com
HARBOR_PROJECT: superprojet
HARBOR_PASSWORD: supermotdepasse
CI_REGISTRY_IMAGE: $HARBOR_REGISTRY/$HARBOR_PROJECT/$CI_PROJECT_NAME
CI_REGISTRY_USER: admin
build image:
stage: build
image: docker:latest
services:
- name: docker:27.0.3-dind
alias: docker
variables:
DOCKER_BUILDKIT: "1"
DOCKER_DRIVER: overlay2
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
CI_REGISTRY_PASSWORD: $HARBOR_PASSWORD
before_script:
- echo "Starting Docker info"
- docker info
script:
- docker pull nginx:latest
- docker tag nginx:latest $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker tag nginx:latest $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
- echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $HARBOR_REGISTRY
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
Dans cette configuration, l'erreur se produit à coup sûr.
Pour remédier à cela, il suffit de retirer la ligne suivante :
DOCKER_HOST: tcp://docker:2375
DOCKER_HOST est une variable d'environnement utilisée par le client Docker pour déterminer où il peut trouver le démon Docker.
En spécifiant tcp://docker:2375, vous indiquez explicitement au client Docker de se connecter au démon Docker sur le conteneur DinD via ce port.
Cependant, dans certains cas, cette configuration explicite peut provoquer des erreurs de résolution DNS ou des problèmes de connectivité.
En retirant cette ligne, vous laissez Docker-in-Docker gérer automatiquement la connexion au démon Docker via l'alias réseau docker défini par GitLab CI/CD. Le conteneur docker:dind est conçu pour gérer cette configuration de manière transparente.