Comment personnaliser les images Docker avec Dockerfiles
Cet article montre comment personnaliser les images Docker à l’aide d’un fichier de description nommé Dockerfile. Vous verrez comment étendre des images existantes, les personnaliser selon vos besoins, et également comment publier l’image résultante sur Docker Hub.
Dans ce tutoriel, vous allez apprendre :
- Comment personnaliser une image avec un Dockerfile.
- Comment publier l’image résultante dans Docker Hub.
HTTPS est activé.
Configuration logicielle requise et conventions utilisées
Introduction
Les articles précédents présentaient les concepts de Docker et quelques commandes de base de Docker. Dans cet article, vous allez voir comment personnaliser et étendre une image Docker existante, en décrivant les modifications dans un fichier Dockerfile et en publiant l’image dans un registre.
Le Dockerfile
Dans l’article précédent, vous avez apporté des modifications à un conteneur en cours d’exécution et validé les modifications dans le cache d’image local. Bien qu’il s’agisse d’une ressource utile pour des situations spécifiques, il est recommandé d’effectuer les personnalisations de manière plus documentée, afin que l’image puisse être déployée sur d’autres hôtes. La méthode recommandée est d’écrire un Dockerfile.
Le Dockerfile est un fichier YAML, c’est-à-dire un fichier texte avec une certaine syntaxe : les relations sont exprimées à l’aide d’indentation (espaces) et chaque ligne est composée de paires clé-valeur.
Commençons par un simple Dockerfile qui installe les props du paquet (contient les commandes htop et ps) sur une image Debian.
Créez un nouveau répertoire, accédez-y et enregistrez le fichier ci-dessous avec le nom Dockerfile (D majuscule) :
FROM debian
RUN apt-get update &&\
apt-get -y install procps
Ce Dockerfile indique que l’image de base est nommée Debian (clause FROM). S’il n’existe pas localement, il sera téléchargé à partir du Docker Hub. La commande RUN exécute apt-get deux fois. Notez l’utilisation d’une barre oblique inverse (\) pour couper une ligne et l’utilisation de -y pour sauter l’invite de confirmation d’apt-get install.
L’étape suivante consiste à construire l’image avec docker build.
docker build -t mydebian .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM debian
---> be2868bebaba
Step 2/2 : RUN apt-get update && apt-get -y install procps
---> Running in 52a16b346afc
…
Removing intermediate container 52a16b346afc
---> f21a05a59966
Successfully built f21a05a59966
Successfully tagged mydebian:latest
L’indicateur -t mydebian nomme la nouvelle image. Le point (.) indique à docker d’utiliser le répertoire actuel pour rechercher un fichier Dockerfile. Notez que de nouvelles couches sont créées et supprimées au fur et à mesure de l’interprétation des lignes du Dockerfile.
Il doit y avoir une nouvelle image dans le cache local.
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mydebian latest f21a05a59966 8 minutes ago 119MB
debian latest be2868bebaba 7 weeks ago 101MB
Un conteneur à partir de cette image peut être créé.
docker run -it --name mydebian_container mydebian
root@ef9eb174874a:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 02:43 pts/0 00:00:00 bash
root 9 1 0 02:43 pts/0 00:00:00 ps -ef
À partir de maintenant, vous pouvez créer des conteneurs exécutant Debian avec le paquet procps, et les commandes htop et ps seront déjà installées.
Créons maintenant un Dockerfile pour avoir Apache et PHP installés au moment de la construction de l’image, afin d’atteindre les mêmes objectifs de l’article précédent, lorsque les commandes étaient exécutées à l’intérieur du conteneur.
FROM debian
RUN apt-get update &&\
apt-get -y install procps libapache2-mod-php
CMD service apache2 start
Nous avons ajouté libapache2-mod-php dans Line 3 et une commande CMD dans Line 4 pour démarrer Apache. Lorsque le conteneur est démarré, la commande CMD est exécutée. Il ne peut exister qu’une seule commande CMD par Dockerfile. Lorsque la commande CMD est spécifiée, elle remplace la commande CMD de l’image que vous étendez. Si la commande CMD est omise, celle de l’image de base sera exécutée (le cas échéant). Comme vous l’avez peut-être deviné, le Dockerfile de l’image de base Debian dispose d’une commande CMD pour exécuter bash. Vous pouvez le vérifier dans le Docker Hub.
docker run -d --name mydebian_container2 -d -p 8000:80 -v "$PWD":/var/www/html mydebian
ad325685b738464c49bff40b65c6824160105ab5c285282efefbc4ddeec20ba2
roger@slash:~/LinuxConfig/04 Dockerfile$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad325685b738 mydebian "/bin/sh -c 'service…" 11 seconds ago Up 5 seconds 0.0.0.0:8000->80/tcp mydebian_container2
Cette fois, nous avons démarré le conteneur à l’aide de l’interrupteur -d car nous voulons qu’il soit détaché du terminal.
Commandes Dockerfile importantes
Le Dockerfile dispose d’autres commandes que FROM, RUN et CMD.
La commande ENV est utilisée pour définir des variables d’environnement dans l’image, comme http_proxy, par exemple. De nombreuses images utilisent des variables d’environnement pour transmettre des paramètres au nouveau conteneur. Par exemple, vérifiez les images de bases de données telles que MySQL et PostgreSQL dans docker hub.
La commande COPY copie les fichiers et les répertoires de l’hôte vers l’image au moment de la construction. Le chemin d’accès à la source (premier argument) est relatif au répertoire courant.
La commande ADD est similaire à COPY, à la différence que, si la source est un fichier tar compressé, il sera automatiquement décompressé dans le répertoire de destination à l’intérieur de l’image. À l’exception de cette utilisation, Docker recommande l’utilisation de la commande COPY dans la mesure du possible.
La commande EXPOSE indique quels ports de l’image peuvent être exposés par Docker. Lors de la création d’un conteneur, ces ports peuvent être mappés aux ports hôtes, si vous le souhaitez.
La commande WORKDIR définit le répertoire que Docker utilisera lorsque les commandes sont exécutées à l’intérieur du conteneur avec docker exec.
Création d’une image avec HTTPS activé
Maintenant, nous allons étendre l’image officielle PHP Apache pour activer SSL avec un certificat généré automatiquement pour illustrer comment utiliser les commandes mentionnées. Dans un nouveau répertoire, créez le fichier Dockerfile suivant.
FROM php:7-apache
RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem -subj "/C=BR/ST=Rio Grande do Sul/L=Porto Alegre/O=Security/OU=Development/CN=example.com"
RUN a2enmod rewrite
RUN a2ensite default-ssl
RUN a2enmod ssl
EXPOSE 443
COPY ./html /var/www/html
WORKDIR /var/www/html
Dans Line 3, nous créons un certificat. Les lignes 5 à 7 activent mod_rewrite et SSL. La ligne 9 expose le port 443 (le port 80 est déjà exposé par l’image en amont). La ligne 11 ajoute le répertoire de l’application au conteneur. Enfin, Line 13 définit le répertoire de travail comme le répertoire de travail Apache. Toutes les commandes exécutées par docker exec utiliseront ce répertoire comme base par défaut.
Maintenant, créez un répertoire nommé html et un fichier nommé phpinfo.php avec ce contenu.
<?php
phpinfo();
?>
Allons maintenant générer et exécuter le conteneur.
docker build -t app_image .
docker run -d --rm -p 80:80 -p 443:443 --name app_container app_image
Désormais, vous pouvez accéder à phpinfo.php script via HTTP et HTTPS.
http://localhost/phpinfo.php
https://localhost/phpinfo.php
HTTPS est activé.
En HTTPS, le navigateur se plaindra de la sécurité du certificat puisqu’il est auto-signé, mais l’avertissement peut être ignoré.
Publication d’images sur le Docker Hub
Les images créées n’existent que localement, dans le cache local de Docker. Vous voudrez peut-être les partager avec d’autres hôtes Docker, ou avec des coéquipiers, ou même les rendre publics au monde entier. Dans tous les cas, vous souhaitez publier vos images dans un registre Docker. Ils peuvent être publiés dans un registre basé sur le cloud, comme le Docker Hub qui, soit dit en passant, est la valeur par défaut si vous ne spécifiez pas explicitement le registre. Créez d’abord un identifiant Docker gratuit, puis connectez-vous :
docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: infroger
Password:
Login Succeeded
Ensuite, marquez l’image avec le nom du référentiel (infroger), le nom de l’image et la balise (version image).
docker tag app_image infroger/app_image:1
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
infroger/app_image 1 c093151fc68f 14 hours ago 381MB
app3_image latest c093151fc68f 14 hours ago 381MB
Poussez ensuite l’image vers le référentiel.
docker push infroger/app_image:1
The push refers to repository [docker.io/infroger/app_image]
27f7f2b01c49: Pushed
81b08cd5fe07: Pushed
d1c23d198f84: Pushed
e66392ad9b85: Pushed
a71f63e3a00f: Pushed
9c58778f21dd: Pushed
973719bed9b7: Pushed
8f5090ef2ac0: Pushed
fbdafdbe3319: Pushed
a5c4801ecf39: Pushed
e9ba112d38b9: Pushed
25ba5230dadf: Pushed
f2907ce42b47: Pushed
e31bf34cfab9: Pushed
9066d03e98e0: Pushed
96db4ce698ad: Pushed
abae6a338e5c: Pushed
4572a80a7a5e: Pushed
ef68f6734aa4: Pushed
1: digest: sha256:2e7e53fcdf800ad0c4837cd70014170cc869d36de5c301f2e2ced318803bf963 size: 4279
Allez maintenant sur Docker Hub et vérifiez que l’image s’y trouve :
https://hub.docker.com/r/infroger/app_image
Dans Docker Hub, avec une inscription gratuite, vous pouvez avoir un dépôt privé, avec un nombre illimité de dépôts publics. Sinon, vous pouvez exécuter votre propre registre Docker, ce qui peut être fait avec une seule commande :
docker run -d -p 5000:5000 --restart=always --name registry registry:2
L’avantage d’avoir un registre privé est la confidentialité. Mais vous avez la charge de gérer la sécurité, la haute disponibilité, les besoins de stockage, le contrôle d’accès, etc.
Conclusion
Dans cet article, nous avons vu comment étendre des images existantes et les personnaliser selon vos besoins à l’aide d’un Dockerfile. Nous avons également vu comment publier les images dans un registre Docker. Vous pouvez faire beaucoup jusqu’à présent, mais nous ne faisons qu’effleurer le monde Docker. Dans le prochain article, nous verrons une forme très simple d’orchestration de conteneurs locaux avec Docker Compose.
Plus d’informations dans cette série d’articles Docker
- Une introduction pratique aux conteneurs Docker
- Comment interagir avec les conteneurs Docker
