Créer sa première image Docker avec DockerFile

Créer sa première image Docker avec DockerFile

Sur Docker Hub, la liste des images disponibles est pléthorique, on peut facilement créer des conteneurs à partir de ces images.

Mais on a parfois besoin de créer sa propre image. Plusieurs solutions s’offrent à nous pour créer son image personnalisée:

  • Créer une image à partir d’un conteneur. On personnalise un conteneur à partir de sa couche éditable, et on crée une nouvelle image à partir de ce conteneur.
  • Créer une image à partir d’un fichier DockerFile

Dans ce tutoriel, nous allons voir comment créer une image à partir d’un DockerFile. Je ferai un autre article sur la coucher éditable des conteneurs.

Qu’est-ce qu’un fichier Dockerfile ?

DockerFile est tout simplement un fichier texte de configuration permettant de créer une image! Il contient toutes les instructions nécessaire à la création d’une image.

Ce format a plusieurs avantages, il permet de facilement versionner son image (Vu que c’est un simple fichier texte), et également de visualiser rapidement les opérations effectuées.

Les instructions DockerFile

Un DockerFile contient une liste d’instruction, voici les instructions de base que l’on va utiliser pendant cet article:

InstructionDescription
FROMImage source
RUNCommande à exécuter pour construire l’image
COPYAjouter un fichier dans l’image
WORKDIRChanger le chemin courant
EXPOSEPorts écoutés par défaut par le conteneur
CMDCommande à exécuter au démarrage du conteneur

Cette liste n’est pas exhaustive, je vous redirige vers la doc officielle: dockerFile reference.

Mon premier DockerFile

Nous allons voir ensemble pour créer une image qui fait tourner une application web basée sur Express.js (Framework minimaliste pour construire des applications web basées sur Node.js).

Un dockerfile commence toujours par FROM, cette instruction indique l’image que l’on va utiliser comme base. Nous allons partir d’une distribution linux Ubuntu:

FROM ubuntu:20.04

Il est possible de partir de rien, pour cela il faut utiliser « FROM scratch ».

Ensuite, nous allons utiliser l’instruction RUN pour exécuter des commandes dans notre conteneur.

Nous allons installer nodejs, installer npm (Utile pour installer express.js), créer un dossier pour notre application web, et enfin installer express.js:

RUN apt-get update \
	&& apt-get install -y nodejs \
	&& apt-get install -y npm \
	&& mkdir myapp && cd myapp && npm init -y && npm install express

Chaque instruction dans un Dockerfile entraîne la création d’une couche

Le nombre de couche impacte la taille des images, du coup ici on limite le nombre d’instructions en exécutant plusieurs commandes dans une seule instruction RUN.

Note: Le nombre de couche est limité à 128.

Notre but, et de faire une petite application web en nodejs totalement inutile qui renvoie en dur « Hello World! »:

const express = require('express')
const app = express()
const port = 80

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Up`)
})

Nous allons ajouter ce fichier à l’image:

COPY app.js /myapp/app.js

Nous allons ensuite changer le répertoire courant:

WORKDIR /myapp

Nous allons définir le port d’écoute de notre application:

EXPOSE 80

En soit, EXPOSE ne fait rien au niveau de l’image, cela sert néanmoins à deux choses:

  • La documentation: Les personnes qui consulte le Dockerfile peuvent ainsi savoir quels ports ils doivent mapper.
  • Commande « docker run » en mode mapping automatique « -P »: La commande peut ainsi automatiquement récupérer les ports à mapper.

Enfin, on indique la commande à exécuter lors du démarrage des conteneurs créés à partir de notre image, dans notre cas on lance notre application app.js:

CMD ["node", "app.js"]

Voici notre Dockerfile dans son intégralité:

FROM ubuntu:20.04

RUN apt-get update \
	&& apt-get install -y nodejs \
	&& apt-get install -y npm \
	&& mkdir myapp && cd myapp && npm init -y && npm install express

COPY app.js /myapp/app.js

WORKDIR /myapp

EXPOSE 80

CMD ["node", "app.js"]

Notre Dockerfile est déjà rédigé! Il ne nous reste plus qu’à créer notre image avec la commande « docker build »:

docker build -t cyrilbois/mywebapp:latest .

L’option « -t » permet d’indiquer le nom (et le tag) de notre image.

Notre image est enfin créé ^^

Si on désire créer un conteneur à partir de notre image:

docker run -d -p 3000:80 --name webapp cyrilbois/mywebapp:latest

Maintenant, on peut accéder à notre application web:

Et voilà, j’espère que ce tutoriel fut utile .

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *