Questions et Réponses d'Entretien Docker

DockerBeginner
Pratiquer maintenant

Introduction

Bienvenue dans ce guide complet conçu pour vous doter des connaissances et de la confiance nécessaires pour exceller lors de votre prochain entretien Docker ! Que vous soyez développeur, ingénieur DevOps ou administrateur système, maîtriser Docker est crucial dans le paysage actuel du cloud-native. Ce document couvre un large éventail de sujets Docker, des concepts fondamentaux et de la gestion des images à l'orchestration avancée, la sécurité et le dépannage, y compris des questions spécifiques aux rôles et des défis pratiques. Préparez-vous à approfondir votre compréhension et à démontrer votre expertise, vous positionnant ainsi pour réussir dans tout rôle lié à Docker.

DOCKER

Fondamentaux et Concepts Clés de Docker

Qu'est-ce que Docker et pourquoi est-il utilisé ?

Réponse :

Docker est une plateforme open-source qui automatise le déploiement, la mise à l'échelle et la gestion des applications à l'aide de la conteneurisation. Il est utilisé pour fournir un environnement cohérent aux applications, garantissant qu'elles s'exécutent de manière fiable dans différents environnements informatiques, du développement à la production.


Expliquez la différence entre une Image Docker et un Conteneur Docker.

Réponse :

Une Image Docker est un package exécutable léger et autonome qui inclut tout le nécessaire pour exécuter un logiciel, y compris le code, le runtime, les outils système, les bibliothèques système et les configurations. Un Conteneur Docker est une instance exécutable d'une Image Docker. Vous pouvez créer, démarrer, arrêter, déplacer ou supprimer un conteneur.


Qu'est-ce qu'un Dockerfile et quel est son objectif ?

Réponse :

Un Dockerfile est un document texte qui contient toutes les commandes qu'un utilisateur peut appeler en ligne de commande pour assembler une image. Il offre un moyen d'automatiser le processus de création d'images, garantissant la reproductibilité et le contrôle de version de l'environnement de votre application.


Comment Docker réalise-t-il l'isolation ?

Réponse :

Docker réalise l'isolation principalement grâce aux fonctionnalités du noyau Linux telles que les namespaces et les control groups (cgroups). Les namespaces fournissent des vues isolées des ressources système (par exemple, les identifiants de processus, les interfaces réseau), tandis que les cgroups limitent et surveillent l'utilisation des ressources (CPU, mémoire, I/O) pour les conteneurs.


Que sont les volumes Docker et pourquoi sont-ils importants ?

Réponse :

Les volumes Docker sont le mécanisme privilégié pour persister les données générées par et utilisées par les conteneurs Docker. Ils sont importants car les conteneurs sont éphémères ; sans volumes, les données à l'intérieur d'un conteneur seraient perdues lorsque le conteneur est supprimé. Les volumes permettent aux données de survivre au conteneur.


Expliquez le concept des couches Docker.

Réponse :

Les images Docker sont composées de plusieurs couches en lecture seule, chacune représentant une instruction Dockerfile. Lorsque vous construisez une image, chaque commande crée une nouvelle couche au-dessus de la précédente. Cette stratification permet un stockage, un partage et une mise en cache efficaces, car les couches communes peuvent être réutilisées sur plusieurs images.


Qu'est-ce que Docker Hub ?

Réponse :

Docker Hub est un service de registre basé sur le cloud fourni par Docker pour trouver et partager des images de conteneurs. Il agit comme un dépôt central où les utilisateurs peuvent pousser leurs images personnalisées et tirer des images officielles ou contribuées par la communauté. Il offre également des builds automatisés et des webhooks.


Comment exposer un port d'un conteneur Docker à la machine hôte ?

Réponse :

Vous exposez un port en utilisant le drapeau -p ou --publish lors de l'exécution d'un conteneur. Par exemple, docker run -p 8080:80 my_image mappe le port 80 à l'intérieur du conteneur au port 8080 sur la machine hôte, permettant un accès externe.


Quel est le but du fichier .dockerignore ?

Réponse :

Le fichier .dockerignore est similaire à .gitignore et spécifie les fichiers et répertoires qui doivent être exclus lors de la construction d'une image Docker. Son but est d'empêcher que des fichiers inutiles (comme le code source, les artefacts de build ou les données sensibles) ne soient copiés dans l'image, réduisant ainsi la taille de l'image et le temps de build.


Expliquez brièvement le démon Docker (dockerd).

Réponse :

Le démon Docker (dockerd) est le service d'arrière-plan qui s'exécute sur la machine hôte et gère les objets Docker tels que les images, les conteneurs, les réseaux et les volumes. Il écoute les requêtes de l'API Docker et les traite, effectuant des tâches telles que la construction d'images, l'exécution de conteneurs et la gestion du stockage.


Dockerfile et Gestion des Images

Qu'est-ce qu'un Dockerfile et pourquoi est-il utilisé ?

Réponse :

Un Dockerfile est un document texte qui contient toutes les commandes qu'un utilisateur peut appeler en ligne de commande pour assembler une image. Il est utilisé pour automatiser le processus de création d'images Docker, garantissant la cohérence et la reproductibilité entre différents environnements.


Expliquez l'objectif de l'instruction FROM dans un Dockerfile.

Réponse :

L'instruction FROM initialise une nouvelle étape de build et définit l'image de base pour les instructions suivantes. Chaque Dockerfile doit commencer par FROM, spécifiant l'image parente à partir de laquelle votre image sera construite, par exemple, FROM ubuntu:22.04.


Quelle est la différence entre CMD et ENTRYPOINT dans un Dockerfile ?

Réponse :

CMD fournit des arguments par défaut pour un conteneur en cours d'exécution, qui peuvent être remplacés par des arguments de ligne de commande. ENTRYPOINT configure un conteneur qui s'exécutera comme un exécutable, et ses arguments sont généralement fixes, CMD lui fournissant des paramètres supplémentaires.


Comment fonctionne le cache de build Docker et pourquoi est-il important ?

Réponse :

Docker met en cache chaque couche pendant le processus de build. Si une instruction et son contexte n'ont pas changé depuis le dernier build, Docker réutilise la couche mise en cache, accélérant considérablement les builds suivants. Ceci est crucial pour des flux de travail de développement efficaces.


Qu'est-ce que le fichier .dockerignore et quel est son objectif ?

Réponse :

Le fichier .dockerignore liste les fichiers et répertoires qui doivent être exclus lorsque le contexte de build est envoyé au démon Docker. Cela empêche l'inclusion de fichiers inutiles dans l'image, réduisant ainsi la taille de l'image et le temps de build, de manière similaire à .gitignore.


Expliquez le concept des builds multi-étapes dans les Dockerfiles.

Réponse :

Les builds multi-étapes vous permettent d'utiliser plusieurs instructions FROM dans votre Dockerfile, chacune démarrant une nouvelle étape de build. Ceci est utilisé pour séparer les dépendances de build des dépendances d'exécution, résultant en des images finales plus petites et plus sécurisées en ne copiant que les artefacts nécessaires des étapes précédentes.


Comment réduire la taille d'une image Docker ?

Réponse :

Pour réduire la taille de l'image, utilisez une image de base minimale (par exemple, Alpine), exploitez les builds multi-étapes, nettoyez les fichiers et caches inutiles après l'installation, consolidez les commandes RUN pour minimiser les couches, et utilisez .dockerignore pour exclure les fichiers non pertinents du contexte de build.


Qu'est-ce qu'une couche d'image Docker et pourquoi sont-elles importantes ?

Réponse :

Une image Docker est composée de plusieurs couches en lecture seule, chacune représentant une instruction dans le Dockerfile. Les couches permettent un stockage et une distribution efficaces grâce à la mise en cache et au partage de couches communes entre les images, réduisant ainsi l'espace disque et les temps de téléchargement.


Quand utiliseriez-vous ADD plutôt que COPY dans un Dockerfile ?

Réponse :

COPY est généralement préféré car il ne copie que les fichiers ou répertoires locaux dans l'image. ADD a des fonctionnalités supplémentaires, telles que l'extraction automatique de tarballs à partir d'URL ou de chemins locaux, mais cela peut entraîner un comportement inattendu ou des risques de sécurité s'il n'est pas géré avec soin.


Comment taguer une image Docker et pourquoi le tagging est-il important ?

Réponse :

Vous taguez une image en utilisant docker build -t <image_name>:<tag> . ou docker tag <source_image>:<source_tag> <target_image>:<target_tag>. Le tagging est crucial pour versionner les images, identifier différentes builds (par exemple, latest, dev, v1.0), et les pousser vers des registres.


À quoi sert l'instruction WORKDIR ?

Réponse :

L'instruction WORKDIR définit le répertoire de travail pour toute instruction RUN, CMD, ENTRYPOINT, COPY ou ADD qui la suit dans le Dockerfile. Elle aide à organiser le système de fichiers à l'intérieur du conteneur et simplifie les commandes ultérieures en fournissant un chemin par défaut.


Orchestration de Conteneurs (Docker Compose & Swarm)

Qu'est-ce que Docker Compose et quand l'utiliser ?

Réponse :

Docker Compose est un outil pour définir et exécuter des applications Docker multi-conteneurs. Vous utilisez un fichier YAML pour configurer les services, les réseaux et les volumes de votre application, puis vous utilisez une seule commande (docker compose up) pour tout démarrer. Il est idéal pour les environnements de développement locaux et les tests.


Expliquez les composants clés d'un fichier docker-compose.yml.

Réponse :

Un fichier docker-compose.yml inclut généralement des services (définissant les composants de l'application comme les serveurs web, les bases de données), des networks (pour la communication inter-services) et des volumes (pour le stockage persistant des données). Chaque service spécifie son image, ses ports, ses variables d'environnement et ses dépendances.


Comment mettre à l'échelle des services avec Docker Compose ?

Réponse :

Bien que Compose soit principalement destiné aux environnements mono-hôte, vous pouvez mettre à l'échelle des services en utilisant le drapeau --scale avec docker compose up. Par exemple, docker compose up --scale web=3 démarrerait trois instances du service 'web'. Pour une véritable mise à l'échelle distribuée, Docker Swarm ou Kubernetes est utilisé.


Qu'est-ce que Docker Swarm et en quoi diffère-t-il de Docker Compose ?

Réponse :

Docker Swarm est la solution d'orchestration de conteneurs native de Docker pour gérer un cluster de moteurs Docker. Compose sert à définir et exécuter des applications multi-conteneurs sur un seul hôte, tandis que Swarm vous permet de déployer et de mettre à l'échelle ces applications sur plusieurs hôtes (nœuds) de manière tolérante aux pannes.


Décrivez les rôles des nœuds 'manager' et 'worker' dans un Docker Swarm.

Réponse :

Les nœuds manager gèrent les tâches du cluster comme le maintien de l'état désiré, la planification des tâches et la découverte de services. Les nœuds worker reçoivent et exécutent les tâches des nœuds manager, exécutant les conteneurs réels. Pour une haute disponibilité, un Swarm doit avoir plusieurs nœuds manager.


Comment initialiser un Docker Swarm et y ajouter des nœuds ?

Réponse :

Vous initialisez un Swarm sur un nœud manager en utilisant docker swarm init. Cette commande affiche un jeton de jointure. Pour ajouter des nœuds worker, vous exécutez docker swarm join --token <token> <manager-ip>:<port> sur chaque worker. Les managers peuvent être ajoutés de manière similaire avec un jeton de jointure différent.


Qu'est-ce qu'un 'service' dans le contexte de Docker Swarm ?

Réponse :

Dans Docker Swarm, un 'service' est la définition des tâches que vous souhaitez exécuter sur le Swarm. Il définit quelle image Docker utiliser, combien de répliques exécuter, quels ports exposer, et d'autres configurations de déploiement. Swarm garantit que le nombre désiré de répliques de service est toujours en cours d'exécution.


Comment Docker Swarm gère-t-il la découverte de services et l'équilibrage de charge ?

Réponse :

Docker Swarm dispose d'une découverte de services intégrée basée sur DNS, permettant aux services de se trouver par leur nom. Il fournit également un équilibrage de charge interne (routing mesh) qui distribue les requêtes sur toutes les répliques saines d'un service, même si la requête atteint un nœud qui n'exécute pas de réplique.


Expliquez le concept de 'rolling updates' (mises à jour progressives) dans Docker Swarm.

Réponse :

Les mises à jour progressives vous permettent de mettre à jour un service vers une nouvelle version sans interruption de service. Swarm met à jour les répliques de manière incrémentielle, remplaçant les anciens conteneurs par de nouveaux un par un ou par lots, garantissant qu'un nombre suffisant d'anciens conteneurs restent en cours d'exécution jusqu'à ce que les nouveaux soient sains.


Quand choisiriez-vous Docker Swarm plutôt que Kubernetes, ou vice-versa ?

Réponse :

Choisissez Docker Swarm pour une orchestration Docker native plus simple, une configuration plus facile, et lorsque vous avez besoin de moins de complexité. Choisissez Kubernetes pour des déploiements à grande échelle très complexes, des fonctionnalités avancées comme l'auto-scaling, l'auto-guérison, et un écosystème plus large, souvent au prix d'une complexité accrue et d'une courbe d'apprentissage plus raide.


Réseau et Stockage dans Docker

Expliquez les pilotes réseau par défaut disponibles dans Docker et leurs principaux cas d'utilisation.

Réponse :

Docker propose plusieurs pilotes réseau par défaut : bridge (par défaut pour les conteneurs autonomes, réseau isolé), host (le conteneur partage la pile réseau de l'hôte, aucune isolation) et none (le conteneur n'a pas d'interfaces réseau). overlay est utilisé pour la communication multi-hôtes dans Swarm, et macvlan attribue une adresse MAC à un conteneur, le faisant apparaître comme un périphérique physique sur le réseau.


Quel est l'objectif d'un réseau bridge défini par l'utilisateur dans Docker, et en quoi diffère-t-il du réseau bridge par défaut ?

Réponse :

Les réseaux bridge définis par l'utilisateur offrent une meilleure isolation, une résolution DNS automatique entre les conteneurs par nom, et une gestion plus facile du mappage des ports par rapport au réseau bridge par défaut. Les conteneurs sur un bridge défini par l'utilisateur peuvent communiquer entre eux en utilisant leurs noms de service sans mappage de port explicite sur l'hôte.


Comment connecter un conteneur en cours d'exécution à un réseau défini par l'utilisateur existant ?

Réponse :

Vous pouvez connecter un conteneur en cours d'exécution à un réseau défini par l'utilisateur existant en utilisant la commande docker network connect. Par exemple : docker network connect my_network my_container. Cela permet au conteneur de communiquer avec d'autres conteneurs sur ce réseau.


Décrivez les différents types de stockage disponibles dans Docker et quand utiliser chacun d'eux.

Réponse :

Docker propose des volumes, des bind mounts (montages liés) et des tmpfs mounts (montages tmpfs). Les volumes sont la méthode préférée pour les données persistantes, gérées par Docker, et idéales pour les bases de données. Les bind mounts lient un chemin d'hôte directement à un chemin de conteneur, utiles pour le développement ou les fichiers de configuration. Les montages Tmpfs stockent les données dans la mémoire de l'hôte, adaptés aux données non persistantes et sensibles.


Que sont les volumes Docker et quels sont leurs avantages par rapport aux bind mounts ?

Réponse :

Les volumes Docker sont la méthode recommandée pour persister les données générées et utilisées par les conteneurs Docker. Ils sont entièrement gérés par Docker, ce qui les rend plus faciles à sauvegarder, migrer et gérer. Les volumes sont également plus performants que les bind mounts, en particulier pour les charges de travail intensives en I/O, et fonctionnent sur différents systèmes d'exploitation.


Comment créer et utiliser un volume Docker nommé ?

Réponse :

Un volume nommé peut être créé en utilisant docker volume create my_data. Pour l'utiliser avec un conteneur, vous le spécifiez avec le drapeau -v lors de la création du conteneur : docker run -d -v my_data:/app/data my_image. Cela monte le volume my_data dans /app/data à l'intérieur du conteneur.


Expliquez le concept du mécanisme 'copy-on-write' (copie à l'écriture) dans le stockage Docker.

Réponse :

Le mécanisme de copie à l'écriture (CoW) est utilisé par les couches d'images de Docker. Lorsqu'un conteneur démarre, il obtient une couche fine et inscriptible au-dessus des couches d'images immuables. Toutes les modifications apportées par le conteneur sont écrites uniquement dans cette couche supérieure, laissant les couches d'images sous-jacentes intactes. Cela optimise le stockage et permet à plusieurs conteneurs de partager efficacement la même image de base.


Comment inspecter les détails réseau ou les informations de volume dans Docker ?

Réponse :

Pour inspecter les détails réseau, utilisez docker network inspect <nom_ou_id_du_réseau>. Cela fournit des informations complètes, y compris les conteneurs connectés, les sous-réseaux et les passerelles. Pour les informations de volume, utilisez docker volume inspect <nom_du_volume>, qui affiche le point de montage, le pilote et d'autres métadonnées.


Quand choisiriez-vous un pilote réseau host plutôt qu'un pilote réseau bridge ?

Réponse :

Vous choisiriez le pilote réseau host lorsque vous avez besoin de performances réseau maximales ou d'un accès direct aux services réseau de l'hôte sans mappage de port. Ceci est souvent utilisé pour les applications critiques en termes de performance ou lorsque le conteneur doit se lier directement à des ports spécifiques de l'hôte, contournant ainsi la pile réseau de Docker.


Quelle est la signification du drapeau --mount par rapport au drapeau -v pour la gestion du stockage dans Docker ?

Réponse :

Le drapeau --mount est la syntaxe la plus récente, plus explicite et préférée pour la gestion du stockage (volumes, bind mounts, tmpfs mounts). Il utilise des paires clé-valeur pour plus de clarté, ce qui le rend plus facile à lire et à comprendre le type de montage et les options. Le drapeau -v est un raccourci qui peut être ambigu quant à savoir s'il s'agit d'un volume ou d'un bind mount en fonction du chemin source.


Questions Basées sur des Scénarios et de Dépannage

Votre conteneur Docker fonctionne, mais votre application à l'intérieur n'est pas accessible. Quelles sont les premières étapes que vous prendriez pour résoudre ce problème ?

Réponse :

Tout d'abord, vérifiez docker logs <id_conteneur> pour les erreurs de l'application. Ensuite, vérifiez les mappages de ports avec docker ps pour vous assurer que le port de l'hôte est correctement exposé. Enfin, utilisez docker exec -it <id_conteneur> bash pour entrer dans le conteneur et vérifier si le processus de l'application est en cours d'exécution et écoute sur le port attendu (par exemple, netstat -tulnp).


Un conteneur Docker redémarre continuellement juste après son démarrage. Quelles pourraient être les causes courantes et comment enquêteriez-vous ?

Réponse :

Les causes courantes incluent une erreur dans le script d'entrée de l'application, une dépendance manquante, ou une exception non gérée provoquant la sortie du processus. J'utiliserais docker logs <id_conteneur> pour voir la sortie avant le crash et docker inspect <id_conteneur> pour vérifier le RestartCount et l'ExitCode.


Vous essayez de construire une image Docker, mais elle échoue lors de l'instruction RUN avec une erreur 'command not found'. Comment déboguez-vous cela ?

Réponse :

Cela signifie généralement que la commande n'est pas disponible dans l'image de base ou n'a pas été correctement installée dans une étape RUN précédente. J'ajouterais des instructions echo avant la commande défaillante pour vérifier les chemins, ou je changerais temporairement la commande RUN en sh -c 'set -x; <commande_originale>' pour voir les détails de l'exécution de la commande. Alternativement, je construisais jusqu'à la couche défaillante, puis j'exécutais cette image intermédiaire avec docker run pour déboguer interactivement.


La taille de votre image Docker est excessivement grande. Quelles stratégies utiliseriez-vous pour réduire sa taille ?

Réponse :

J'utiliserais des builds multi-étapes pour séparer les dépendances de compilation des artefacts d'exécution. Je choisirais également une image de base plus petite (par exemple, Alpine), supprimerais les fichiers et caches inutiles, et combinerais les commandes RUN en utilisant && pour minimiser les couches. L'utilisation de .dockerignore pour exclure les fichiers non pertinents est également cruciale.


Vous devez partager des données entre plusieurs conteneurs Docker. Quelles sont vos options et quand choisiriez-vous chacune d'elles ?

Réponse :

Les options incluent les volumes Docker, les bind mounts et le stockage réseau partagé. Les volumes Docker sont préférés pour les données persistantes et la gestion du cycle de vie des données, en particulier pour les bases de données. Les bind mounts sont bons pour le développement, permettant aux modifications de fichiers de l'hôte de se refléter instantanément. Le stockage réseau partagé (comme NFS) est destiné aux applications distribuées nécessitant un accès partagé sur plusieurs hôtes.


Un conteneur Docker consomme trop de CPU/mémoire. Comment identifieriez-vous le coupable et atténueriez-vous le problème ?

Réponse :

J'utiliserais docker stats pour surveiller l'utilisation des ressources en temps réel. Si un conteneur spécifique est le problème, j'utiliserais docker exec pour y entrer et utiliser des outils comme top ou htop pour identifier le processus. L'atténuation implique d'optimiser l'application, de définir des limites de ressources (--cpus, --memory) lors de docker run, ou de mettre à l'échelle le service.


Vous avez mis à jour votre image Docker, mais docker run démarre toujours l'ancienne version. Que se passe-t-il ?

Réponse :

Cela signifie généralement que l'étiquette d'image que vous utilisez (par exemple, myimage:latest) n'a pas été mise à jour localement. Je commencerais par exécuter docker pull myimage:latest pour m'assurer que la dernière image est téléchargée. Si le problème persiste, vérifiez l'ID de l'image avec docker images pour confirmer que vous téléchargez la bonne.


Comment vous assurer que vos conteneurs Docker redémarrent automatiquement si le démon Docker lui-même redémarre ou si la machine hôte redémarre ?

Réponse :

J'utiliserais une politique de redémarrage lors de l'exécution du conteneur, telle que --restart unless-stopped ou --restart always. unless-stopped redémarrera le conteneur sauf s'il a été explicitement arrêté, tandis que always le redémarrera toujours quelle que soit son état précédent, même s'il a été arrêté manuellement.


Vous rencontrez des problèmes de connectivité réseau entre deux conteneurs Docker sur le même hôte. Quelles étapes suivriez-vous pour diagnostiquer cela ?

Réponse :

Tout d'abord, vérifiez que les deux conteneurs sont sur le même réseau Docker en utilisant docker inspect <id_conteneur>. Ensuite, essayez de pinger un conteneur depuis l'autre en utilisant son nom de conteneur ou son adresse IP. Vérifiez les règles de pare-feu sur l'hôte et à l'intérieur des conteneurs, et assurez-vous qu'il n'y a pas de conflits de ports s'ils exposent des ports.


Votre conteneur Docker fonctionne, mais vous ne pouvez pas écrire dans un répertoire spécifique à l'intérieur. Quel pourrait être le problème ?

Réponse :

Il s'agit souvent d'un problème de permissions. J'utiliserais docker exec pour entrer dans le conteneur et vérifier la propriété et les permissions du répertoire en utilisant ls -ld <répertoire>. L'utilisateur exécutant l'application à l'intérieur du conteneur pourrait ne pas avoir les droits d'écriture. L'ajustement des permissions avec chmod ou chown dans le Dockerfile ou le script d'entrée peut résoudre ce problème.


Sécurité Docker et Bonnes Pratiques

Quelles sont les principales préoccupations de sécurité lors de l'utilisation de conteneurs Docker ?

Réponse :

Les principales préoccupations incluent l'évasion de conteneur, les images non sécurisées, la mauvaise configuration du démon, l'escalade de privilèges, le déni de service et l'exposition de données sensibles. Il est crucial de sécuriser l'hôte, les images, les conteneurs et le réseau.


Comment minimiser la surface d'attaque d'une image Docker ?

Réponse :

Utilisez des images de base minimales (par exemple, Alpine), supprimez les paquets et dépendances inutiles, évitez d'installer des outils de développement et utilisez des builds multi-étapes pour séparer les dépendances de compilation des artefacts d'exécution.


Pourquoi est-il une mauvaise pratique d'exécuter des conteneurs en tant que root, et quelle est l'alternative ?

Réponse :

L'exécution en tant que root accorde des privilèges excessifs, augmentant le risque d'évasion de conteneur ou d'escalade de privilèges en cas de compromission. L'alternative est de créer un utilisateur dédié non-root à l'intérieur du conteneur et d'exécuter les processus en tant que cet utilisateur.


Expliquez le principe du moindre privilège dans le contexte de Docker.

Réponse :

Cela signifie accorder uniquement les permissions nécessaires à un conteneur ou à un processus pour fonctionner. Cela inclut la limitation des capacités, l'évitement du drapeau --privileged, la restriction des montages de volumes et l'exécution en tant qu'utilisateur non-root.


Que sont Docker Content Trust et Docker Notary, et comment améliorent-ils la sécurité ?

Réponse :

Docker Content Trust (DCT) permet aux éditeurs d'images de signer leurs images et aux consommateurs de vérifier l'intégrité et l'authenticité des images. Notary est la technologie sous-jacente qui fournit une publication et une vérification cryptographiquement sécurisées.


Comment gérer les informations sensibles (par exemple, clés API, mots de passe) en toute sécurité dans les conteneurs Docker ?

Réponse :

Évitez d'intégrer en dur les secrets dans les Dockerfiles ou de les commiter dans le contrôle de version. Utilisez Docker Secrets (pour Swarm) ou Kubernetes Secrets (pour Kubernetes), les variables d'environnement (avec prudence), ou des outils externes de gestion de secrets comme HashiCorp Vault.


Quel est le but du profil seccomp par défaut de Docker ?

Réponse :

Le profil seccomp (secure computing mode) par défaut restreint les appels système qu'un conteneur peut effectuer auprès du noyau. Cela réduit considérablement la surface d'attaque en empêchant les appels système malveillants ou inutiles.


Comment scanner les images Docker à la recherche de vulnérabilités ?

Réponse :

Utilisez des outils d'analyse de vulnérabilités tels que Clair, Trivy, Anchore Engine ou Docker Scout. Ces outils analysent les couches d'images à la recherche de vulnérabilités connues dans les paquets et dépendances installés, fournissant des rapports exploitables.


Quelles sont les bonnes pratiques pour sécuriser le démon Docker ?

Réponse :

Restreignez l'accès au socket Docker, activez TLS pour l'accès à distance, configurez une journalisation appropriée, maintenez le démon et le moteur Docker à jour, et évitez d'exposer le démon à des réseaux non fiables.


Pourquoi devriez-vous mettre à jour régulièrement vos images Docker et le moteur Docker ?

Réponse :

Les mises à jour régulières garantissent que vous disposez des derniers correctifs de sécurité et corrections de bugs pour les images de base et le moteur Docker lui-même. Cela atténue les vulnérabilités connues et améliore la stabilité globale du système.


Sujets Docker Avancés et Optimisation des Performances

Expliquez le concept des Réseaux Overlay Docker et quand les utiliser.

Réponse :

Les Réseaux Overlay Docker permettent la communication entre les conteneurs Docker s'exécutant sur différents hôtes Docker. Ils sont cruciaux pour l'orchestration de conteneurs multi-hôtes, comme dans un cluster Docker Swarm ou Kubernetes, permettant aux services de communiquer de manière transparente entre les nœuds sans configurations de routage complexes.


Quel est le but de Docker Content Trust (DCT) et comment fonctionne-t-il ?

Réponse :

Docker Content Trust (DCT) assure la vérification cryptographique des éditeurs d'images et de leur intégrité. Il garantit que les images tirées d'un registre sont signées par des éditeurs de confiance, empêchant l'utilisation d'images falsifiées ou non autorisées. Il fonctionne en utilisant Notary pour signer et vérifier les manifestes d'images.


Comment limiter les ressources (CPU, mémoire) qu'un conteneur Docker peut consommer ?

Réponse :

Les limites de ressources peuvent être définies à l'aide des drapeaux docker run. Pour le CPU, utilisez --cpus (par exemple, --cpus='1.5') ou --cpu-shares. Pour la mémoire, utilisez --memory (par exemple, --memory='2g') et --memory-swap. Ces paramètres empêchent un seul conteneur de monopoliser les ressources de l'hôte.


Décrivez la différence entre COPY et ADD dans un Dockerfile.

Réponse :

COPY copie les fichiers ou répertoires locaux du contexte de build dans l'image. ADD a une fonctionnalité similaire mais peut également extraire des archives tar de la source et télécharger des fichiers depuis des URL. Généralement, COPY est préféré pour la clarté et la sécurité, sauf si les fonctionnalités supplémentaires de ADD sont spécifiquement nécessaires.


Qu'est-ce qu'une build multi-étapes dans Docker et quels sont ses avantages ?

Réponse :

Une build multi-étapes utilise plusieurs instructions FROM dans un seul Dockerfile, où chaque FROM peut rejeter les artefacts des étapes précédentes. Cela réduit considérablement la taille de l'image finale en copiant uniquement les artefacts de build nécessaires (par exemple, les binaires compilés) dans l'image d'exécution finale plus petite, améliorant ainsi la sécurité et la vitesse de déploiement.


Comment optimiser la taille des images Docker et la vitesse de build ?

Réponse :

Optimisez la taille de l'image en utilisant des builds multi-étapes, en choisissant des images de base plus petites (par exemple, Alpine), en tirant parti de .dockerignore, et en consolidant les commandes RUN. Optimisez la vitesse de build en ordonnant les instructions du Dockerfile pour maximiser la mise en cache des couches, en utilisant un fichier .dockerignore, et en vous assurant que le contexte de build est minimal.


Expliquez les drivers de stockage de Docker et leur impact sur les performances.

Réponse :

Docker utilise des drivers de stockage (par exemple, OverlayFS, AUFS, Btrfs) pour gérer la manière dont les couches sont stockées et combinées. OverlayFS est généralement recommandé pour ses performances et sa simplicité, en particulier pour les charges de travail à forte lecture. Le choix du driver impacte le temps de démarrage du conteneur, les performances d'écriture et les E/S disque globales.


Qu'est-ce que Docker Swarm Mode et en quoi diffère-t-il de Kubernetes ?

Réponse :

Docker Swarm Mode est l'outil d'orchestration natif de Docker pour gérer un cluster de moteurs Docker. Il est plus simple à configurer et à utiliser que Kubernetes, ce qui le rend adapté aux déploiements plus petits ou à ceux qui sont déjà fortement investis dans l'écosystème Docker. Kubernetes est un orchestrateur plus puissant, riche en fonctionnalités et complexe, largement adopté pour les déploiements à grande échelle et en production.


Comment dépanner un conteneur Docker qui redémarre continuellement ?

Réponse :

Tout d'abord, vérifiez les logs du conteneur en utilisant docker logs <id_conteneur>. Ensuite, inspectez l'état du conteneur avec docker inspect <id_conteneur> pour voir les codes de sortie et les politiques de redémarrage. Vous pouvez également essayer d'exécuter le conteneur de manière interactive (docker run -it ...) pour observer son comportement directement ou y attacher (docker attach).


Décrivez les modes réseau de Docker et leurs cas d'utilisation.

Réponse :

Docker propose plusieurs modes réseau : bridge (par défaut, réseau isolé pour les conteneurs), host (le conteneur partage la pile réseau de l'hôte), none (aucune interface réseau), et overlay (pour la communication multi-hôtes). bridge est courant pour les applications sur un seul hôte, host pour les applications critiques en termes de performance nécessitant un accès direct aux ports, et overlay pour les services distribués.


Questions Spécifiques par Rôle (Développeur, DevOps, Administrateur)

Développeur : Comment vous assurez-vous que vos images Docker sont aussi petites que possible ?

Réponse :

J'utilise des builds multi-étapes pour séparer les dépendances de compilation des dépendances d'exécution. De plus, j'exploite des images de base plus petites comme Alpine, je consolide les commandes RUN et je supprime les fichiers ou caches inutiles.


Développeur : Expliquez le but d'un fichier .dockerignore et donnez un exemple de son utilisation.

Réponse :

Un fichier .dockerignore spécifie les fichiers et répertoires à exclure lors de la construction d'une image Docker, similaire à .gitignore. Cela empêche l'ajout de fichiers inutiles au contexte de build, accélérant les builds et réduisant la taille de l'image. Exemple : *.log ou node_modules/.


DevOps : Décrivez comment vous implémenteriez un pipeline CI/CD pour une application Dockerisée.

Réponse :

J'utiliserais un outil CI/CD (par exemple, Jenkins, GitLab CI, GitHub Actions) pour automatiser la construction de l'image Docker lors d'un commit de code, l'exécution des tests, le push de l'image vers un registre, puis son déploiement sur un environnement cible (par exemple, Kubernetes, Docker Swarm).


DevOps : Comment gérez-vous les secrets (par exemple, clés API, mots de passe de base de données) dans un environnement Dockerisé ?

Réponse :

Pour le développement, je pourrais utiliser des variables d'environnement ou des fichiers .env. En production, je préfère Docker Secrets ou Kubernetes Secrets pour le stockage et l'injection sécurisés. Vault ou des outils similaires de gestion de secrets peuvent également être intégrés pour des scénarios plus avancés.


DevOps : Quelles stratégies utilisez-vous pour les mises à jour progressives (rolling updates) et les retours arrière (rollbacks) des conteneurs Docker en production ?

Réponse :

J'utilise des outils d'orchestration comme Docker Swarm ou Kubernetes, qui prennent en charge nativement les mises à jour progressives en remplaçant progressivement les anciens conteneurs par de nouveaux. Pour les retours arrière, je peux revenir à une balise d'image précédente ou à une configuration de déploiement, en tirant parti des capacités de la plateforme d'orchestration.


Administrateur : Comment surveillez-vous la santé et les performances des conteneurs Docker et du démon Docker ?

Réponse :

J'utilise docker stats pour des vérifications rapides. Pour une surveillance complète, j'intègre des outils comme Prometheus et Grafana pour collecter des métriques (CPU, mémoire, E/S réseau) à partir des cgroups et de l'API Docker, et je configure des alertes.


Administrateur : Expliquez les modes réseau de Docker et quand vous utiliseriez chacun d'eux.

Réponse :

Les modes courants incluent bridge (par défaut, réseau isolé pour les conteneurs), host (le conteneur partage la pile réseau de l'hôte), et none (aucune interface réseau). Bridge est pour la plupart des applications, host pour les applications critiques en termes de performance nécessitant un accès direct aux ports, et none pour des cas spécialisés ou le débogage.


Administrateur : Qu'est-ce que Docker Swarm, et quand le choisiriez-vous plutôt que Kubernetes ?

Réponse :

Docker Swarm est l'outil d'orchestration natif de Docker pour gérer un cluster d'hôtes Docker. Je choisirais Swarm pour des déploiements plus simples, à plus petite échelle, ou lorsque j'ai besoin d'une configuration rapide avec une surcharge minimale, car il est plus facile à apprendre et à gérer que Kubernetes.


Administrateur : Comment gérez-vous les données persistantes pour les conteneurs Docker ?

Réponse :

J'utilise les volumes Docker pour le stockage persistant des données, car ils sont gérés par Docker et indépendants du cycle de vie du conteneur. Les montages de liaison (bind mounts) peuvent également être utilisés pour le développement ou lorsque l'accès au système de fichiers de l'hôte est requis.


Administrateur : Décrivez un scénario où vous utiliseriez Docker Compose.

Réponse :

J'utilise Docker Compose pour définir et exécuter des applications Docker multi-conteneurs. Par exemple, je l'utiliserais pour configurer un environnement de développement local composé d'une application web, d'une base de données et d'un service de mise en cache, le tout défini dans un seul fichier docker-compose.yml.


Défis Pratiques et Concrets

Vous avez un Dockerfile qui construit une image, mais le processus de build est très lent en raison de nombreuses couches. Comment optimiseriez-vous le Dockerfile pour réduire le temps de build et la taille de l'image ?

Réponse :

Pour optimiser, je réorganiserais les instructions pour placer celles qui changent fréquemment (comme COPY le code de l'application) après celles qui changent moins fréquemment (comme FROM, RUN apt-get update). Je consoliderais également les commandes RUN en utilisant && pour réduire le nombre de couches et supprimerais les fichiers inutiles (rm -rf /var/lib/apt/lists/*) dans la même commande RUN.


Décrivez comment vous mettriez en place une build multi-étapes pour une application Go afin de créer une image Docker petite et prête pour la production.

Réponse :

Dans la première étape, j'utiliserais une image de build Go pour compiler l'application. Dans la seconde étape, j'utiliserais une image de base minimale comme scratch ou alpine et je copieraie uniquement le binaire compilé de la première étape. Cela réduit considérablement la taille de l'image finale en excluant les outils de build et les dépendances.


Vous devez exécuter un conteneur de base de données (par exemple, PostgreSQL) et un conteneur d'application qui s'y connecte. Comment vous assureriez-vous qu'ils peuvent communiquer et que les données de la base de données persistent après les redémarrages du conteneur ?

Réponse :

J'utiliserais un réseau Docker (par exemple, docker network create my-app-net) pour connecter les deux conteneurs. Pour la persistance des données, j'utiliserais un volume Docker (docker volume create pg-data) et je le monterais dans le répertoire de données du conteneur de base de données (-v pg-data:/var/lib/postgresql/data).


Un conteneur Docker ne parvient pas à démarrer avec un message d'erreur qui s'affiche rapidement. Comment débogueriez-vous ce problème ?

Réponse :

J'utiliserais docker logs <id_conteneur_ou_nom> pour afficher la sortie du conteneur. S'il se termine immédiatement, j'ajouterais une commande tail -f /dev/null ou sleep infinity au CMD ou ENTRYPOINT dans le Dockerfile (ou je la remplacerais avec docker run) pour maintenir le conteneur en cours d'exécution pour inspection, puis j'y accéderais avec docker exec.


Vous avez un fichier docker-compose.yml pour une application multi-services. Comment mettriez-vous à l'échelle un service spécifique (par exemple, un serveur web) pour exécuter plusieurs instances ?

Réponse :

J'utiliserais la commande docker-compose up --scale web=3, où web est le nom du service et 3 est le nombre d'instances souhaité. Docker Compose démarrera alors trois conteneurs distincts pour le service 'web', souvent avec un équilibrage de charge si un proxy inverse est en place.


Expliquez la différence entre COPY et ADD dans un Dockerfile et quand vous utiliseriez chacun d'eux.

Réponse :

COPY copie les fichiers ou répertoires locaux du contexte de build vers l'image. ADD possède des fonctionnalités supplémentaires : il peut extraire des fichiers tar et télécharger des fichiers depuis des URL. Généralement, COPY est préféré pour la clarté et la prévisibilité, en utilisant ADD uniquement lorsque ses fonctionnalités supplémentaires sont spécifiquement nécessaires.


Comment nettoieriez-vous les ressources Docker inutilisées (images, conteneurs, volumes, réseaux) pour libérer de l'espace disque ?

Réponse :

J'utiliserais docker system prune. Cette commande supprime tous les conteneurs arrêtés, toutes les images orphelines (dangling), tout le cache de build orphelin, et éventuellement tous les volumes (-v) et réseaux inutilisés. C'est un moyen complet de récupérer de l'espace disque.


Un conteneur Docker doit accéder à des fichiers sur la machine hôte. Comment y parviendriez-vous ?

Réponse :

J'utiliserais un montage de liaison (bind mount). Par exemple, docker run -v /chemin/hote:/chemin/conteneur mon-image. Cela monte un répertoire du système de fichiers de l'hôte directement dans le conteneur, permettant un accès bidirectionnel aux fichiers.


Vous avez apporté des modifications à votre code d'application. Comment mettez-vous à jour un conteneur Docker en cours d'exécution avec ces modifications ?

Réponse :

Vous ne pouvez pas mettre à jour directement le code d'un conteneur en cours d'exécution. Vous devez reconstruire l'image Docker avec le nouveau code (docker build), puis arrêter l'ancien conteneur (docker stop), le supprimer (docker rm), et enfin démarrer un nouveau conteneur à partir de l'image mise à jour (docker run). Pour les environnements orchestrés, cela est géré par les mises à jour progressives.


Résumé

Maîtriser Docker pour les entretiens témoigne de votre dévouement et de votre compréhension du développement logiciel moderne. En vous préparant minutieusement aux questions décrites dans ce document, vous vous êtes non seulement donné les moyens d'articuler efficacement vos connaissances, mais vous avez également approfondi votre compréhension pratique de la conteneurisation. Cette préparation est une étape essentielle pour démontrer votre valeur aux employeurs potentiels et obtenir le rôle que vous désirez.

N'oubliez pas que le paysage technologique est en constante évolution. Continuez à explorer les nouvelles fonctionnalités de Docker, les meilleures pratiques et les technologies connexes comme Kubernetes. Adoptez l'apprentissage continu, contribuez à des projets et restez curieux. Votre engagement envers la croissance vous assurera de rester un professionnel très recherché dans le monde dynamique du DevOps et de l'informatique cloud-native. Bonne chance dans votre parcours !