Docker
Docker dans Docker
Recherche…
Jenkins CI Container utilisant Docker
Ce chapitre décrit comment configurer un conteneur Docker avec Jenkins à l'intérieur, capable d'envoyer des commandes Docker à l'installation Docker (le démon Docker) de l'hôte. Utiliser efficacement Docker dans Docker. Pour ce faire, nous devons créer une image Docker personnalisée basée sur une version arbitraire de l'image officielle Jenkins Docker. Le fichier Dockerfile (l'instruction de génération de l'image) ressemble à ceci:
FROM jenkins
USER root
RUN cd /usr/local/bin && \
curl https://master.dockerproject.org/linux/amd64/docker > docker && \
chmod +x docker && \
groupadd -g 999 docker && \
usermod -a -G docker jenkins
USER Jenkins
Ce fichier Dockerfile crée une image qui contient les fichiers binaires du client Docker que ce client est utilisé pour communiquer avec un démon Docker. Dans ce cas, le démon Docker de l'hôte. L'instruction RUN
dans ce fichier crée également un groupe d'utilisateurs UNIX avec l'UID 999 et y ajoute l'utilisateur Jenkins. Pourquoi exactement cela est nécessaire est décrit dans le chapitre suivant. Avec cette image, nous pouvons exécuter un serveur Jenkins qui peut utiliser les commandes Docker, mais si nous exécutons simplement cette image, le client Docker installé dans l'image ne peut pas communiquer avec le démon Docker de l'hôte. Ces deux composants communiquent via un socket UNIX /var/run/docker.sock
. Sous Unix, c'est un fichier comme tout le reste, donc nous pouvons facilement le monter dans le conteneur Jenkins. Ceci est fait avec la commande docker run -v /var/run/docker.sock:/var/run/docker.sock --name jenkins MY_CUSTOM_IMAGE_NAME
. Mais ce fichier monté appartient à docker:root
et à cause de cela, le fichier Dockerfile crée ce groupe avec un UID bien connu et y ajoute l'utilisateur Jenkins. Maintenant, le conteneur Jenkins est vraiment capable d’exécuter et d’utiliser Docker. En production, la commande run doit également contenir -v jenkins_home:/var/jenkins_home
pour sauvegarder le répertoire Jenkins_home et bien sûr un mappage de port pour accéder au serveur via le réseau.