Aller au contenu

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.