Menu Fermer

Créer sa première image Docker

Personnellement ce que j’adore avec Docker c’est la facilité avec laquelle il est possible de lancer des conteneurs grâce aux images qui sont sur le DockerHub.

Mais lorsque l’on a un besoin particulier notamment dans le cadre professionnel réaliser sa propre image devient indispensable. Ce qui est très facile à faire avec Docker grâce au Dockerfile.

Dockerfile vers un conteneur

Un Dockerfile c’est quoi ?

Un Dockerfile est un fichier texte avec lequel vous allez pouvoir donner à Docker les instructions nécessaires pour pouvoir créer une image. C’est un peut comme la recette de cuisine d’un plat pour un cuisinier.

Pour commencer il faut bien comprendre comment se rédige un Dockerfile, il y a une syntaxe à respectée avec les instructions suivantes:

  • FROM permet de définir l’image source
  • LABEL permet d’ajouter des métadonnées à une image
  • RUN permet d’exécuter des commandes dans votre conteneur
  • ADD permet d’ajouter des fichiers dans votre conteneur
  • WORKDIR permet de définir votre répertoire de travail
  • EXPOSE permet de définir les ports d’écoute par défaut
  • VOLUME permet de définir les volumes utilisables
  • CMD permet de définir la commande par défaut lors de l’exécution de vos conteneurs Docker.

Rédiger son premier Dockerfile

Pour notre exemple nous nous allons construire une image pour le logiciel SCRUMBLR qui permet d’afficher un tableau de suivis des taches modifiable en temps réel.
Ce logiciel utilise Redis et NodeJS pour fonctionner nous allons voir comment créer une image Docker de celui-ci pour obtenir le résultat suivant:

Capture d'écran de scrumblr

Un fichier Dockerfile est toujours rédigé de la même manière. On commence par mettre l’image qui va nous servir de base de travail puis on effectue des actions sur cette image. Pour trouvez l’image qui correspond à votre besoin je vous conseille de partir d’une image officielle. Ces images sont régulièrement mise à jour et son certifiées par Docker.

Les prérequis

Il y a quelques prérequis pour réaliser ce tutoriel:

L’image de base

Pour notre projet nous allons partir avec une image Ubuntu 18.04 qui est une image officielle.

FROM ubuntu:18.04
LABEL maintainer="kevin@linit.io"

Comme indiquer précédemment on déclare l’image que nous allons utiliser dans notre Dockerfile par la directive FROM suivi du nom de l’image et sa version.
La directive LABEL permet d’ajouter des informations à l’image dans notre cas l’adresse mail du mainteneur de l’image.

Installation des prérequis

# Installation des prérequis
RUN apt-get update && apt-get install -y wget sudo supervisor git redis && \
    mkdir -p /var/log/supervisor && \
    mkdir -p /etc/supervisor/conf.d

Nous commençons maintenant la modification de l’image de base. Pour effectuer une commande on utilise la directive RUN qui exécute uniquement LA commande déclarée après la directive.

Dans cette étape nous installons les différents prérequis au fonctionnement de SCRUMBLR à savoir:

  • Mise à jours des dépôts
  • Installation de paquets (wget, sudo, supervisor, git et redis)
  • Création du dossier supervisor dans /var/log/
  • Création du dossier conf.d dans /etc/supervisor/

Pour exécuter plusieurs commandes à la suite vous devez les imbriquées les unes à la suite des autres avec « && » qui permet en code bash d’exécuter des commandes en série et « \ » qui permet de faire un retour à la ligne pour y voir plus clair dans le code.

Pour l’étape suivante nous allons fournir le fichier de configuration du service supervisor à Docker pour qu’il le copie dans notre image.

Pour commencer créer un fichier supervisor.conf dans le répertoire où est votre Dockerfile et ajoutez le contenu suivant.

[supervisord]
nodaemon=true

[program:redis-server]
command=redis-server
autostart=true
autorestart=true
user=root
stdout_logfile=/var/log/redis/stdout.log
stderr_logfile=/var/log/redis/stderr.log

[program:scrumblr]
command=node server.js --port 80
autostart=true
autorestart=true
user=root
stdout_logfile=/var/log/supervisor/scrumblr.log
stderr_logfile=/var/log/supervisor/scrumblr_err.log

Puis on indique à Docker avec la directive ADD d’ajouter notre fichier supervisor.conf dans le dossier /etc/ de notre image.

ADD supervisor.conf /etc/supervisor.conf

Installation de NodeJS

Nous allons maintenant installer dans notre image NodeJS qui va nous permettre de compiler et exécuter les sources de SCRUMBLR. Comme auparavant nous allons utiliser la directive RUN pour exécuter les actions suivantes.

  • Téléchargement du script d’installation de NodeJS
  • Exécution du script téléchargé
  • Installation du paquet NodeJS
# Installation de NodeJS
RUN wget -qO- https://deb.nodesource.com/setup_10.x | sudo -E bash - && \
    apt-get install -y nodejs

Installation de SCRUMBLR

Nous pouvons maintenant installer l’application SCRUMBLR dans notre image toujours en utilisant la directive RUN pour réaliser les actions suivantes:

  • Clone des sources de SCRUMBLR depuis le dépot GitHub du projet
  • Déplacement dans le dossier /scrumblr
  • Installation de SCRUMBLR via npm
# Installation de SCRUMBLR 
RUN git clone https://github.com/aliasaria/scrumblr.git && \
    cd scrumblr && \
    npm install

Modification du fichier config.js

Pour la dernière étape de configuration nous devons modifier une ligne du fichier « config.js » afin de permettre à l’application de pouvoir se connectée à la base de donnée redis.

La ligne suivante qui utilise une nouvelle fois la directive RUN utilise la commande « sed » afin de replacer la chaine de caractère 127.0.0.1:6379 en redis://127.0.0.1:6379.

# Modification du fichier config.js
RUN sed -i -e "s/127.0.0.1:6379/redis:\/\/127.0.0.1:6379/g" /scrumblr/config.js

Finalisation du Dockerfile

Pour finir nous allons fournir à Docker les instructions nécessaires afin d’exécuter notre image dans un conteneur.

  • WORKDIR indique le répertoire de travail du conteneur ici /scrumblr
  • EXPOSE indique le port de communication dans notre cas le 80
  • STOPSIGNAL indique le signal système qui arrête le conteneur
  • CMD indique la commande à exécuter au démarrage du conteneur
WORKDIR /scrumblr
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["supervisord", "-c", "/etc/supervisor.conf"]

Si la commande dans la directive CMD est composée de plusieurs champs il faut impérativement respecter la syntaxe suivante:

[« champs1 », « champs2 », « champs3 », « champs…. »]

Notre Dockerfile est maintenant terminé et devrait ressemblé à ceci:

FROM ubuntu:18.04
LABEL maintainer="kevin@linit.io"

# Installation des prérequis
RUN apt-get update && apt-get install -y wget sudo supervisor git redis && \
    mkdir -p /var/log/supervisor && \
    mkdir -p /etc/supervisor/conf.d

ADD supervisor.conf /etc/supervisor.conf

# Installation de NodeJS
RUN wget -qO- https://deb.nodesource.com/setup_10.x | sudo -E bash - && \
    apt-get install -y nodejs

# Installation de SCRUMBLR 
RUN git clone https://github.com/aliasaria/scrumblr.git && \
    cd scrumblr && \
    npm install

# Modification du fichier config.js
RUN sed -i -e "s/127.0.0.1:6379/redis:\/\/127.0.0.1:6379/g" /scrumblr/config.js

WORKDIR /scrumblr
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["supervisord", "-c", "/etc/supervisor.conf"]

Construction et lancement de notre image

Il ne nous reste plus qu’à construire notre image en la nommant correctement. Pour faire ceci déplacer vous dans le répertoire où est contenu votre Dockerfile et le ficher supervisor.conf et lancer la commande suivante:

docker build -t scrumblr .
  • L’argument -t permet de spécifier un tag à notre image.
Capture d'écran terminal montrant la commande SED

Une fois votre image construite et taggée vous pouvez l’exécuter et valider son fonctionnement avec la commande suivante:

docker run --detach --publish 8080:80 --name scrumblr scrumblr:latest
  • –detach permet d’exécuter le conteneur en mode détacher c’est à dire que le conteneur va fonctionner en mode service.
  • –publish permet de spécifier le port pour accéder à l’application. Il faut spécifier tout d’abord le port de l’hôte ici le 8080 puis le port du conteneur exposer précédemment.
  • –name permet de définir le nom du conteneur.
Capture d'écran montrant la commande docker run

Maintenant que votre conteneur est lancé vous pouvez accéder a votre SCRUMBLR via l’adresse ip de votre hôte Docker sur le port 8080.

Capture d'écran d'un navigateur web avec SCRUMBLR

Articles similaires