1. Introduction au DockerFile

On va commencer de rendre la chose un peu plus fun en créant des Dockerfile. Ces fichiers servent à créer des images personnalisé en un seul fichier. Nous pourrons donc personnalisé une images de base en l’appelant dans un dockerfile, puis en lui entrant différent paramètre. Une foie le dockerfile créer, il suffit de le “builder” et une nouvelle image sera créer.

Comme il le sera détaillé plus loin dans cette page, un dockerfil est découper en 3 parties :

  • Une image de base : C’est l’image à partir de laquelle nous allons créer notre image personnalisée. En effet, nous nous baserons toujours sur une image de base pour créer nos images personnalisée, nous n’allons pas créer un système d’exploitation tout ,seul.
  • Les instructions : Elles sont des commandes docker qui permettent d’apporter des modification à l’image de base pour en faire une image abouti de votre application. Configuration de l’application backend par exemple.
  • L’action : Ceci est la commande qui sera exécuter au démarrage du container.

Editeur VSCode

L’extention VSCode remote Docker est une extension officielle de Microsoft permettant de gérer simplement les containers dans vscode et avec des couleur de syntaxe.

L’installation s effectue soit par l’onglet plugin et on cherchera alors : Docker puis on installera le plugin VS Code Remote Docker.

Deuxième solution d’installation, faire Ctrl+P puis entrer :

ext install ms-azuretools.vscode-docker

Créer notre premier DockerFile

Dans un nouveau dossier, créez un fichier Dockerfile.

Attention : Le fichier doit IMPéRATIVEMENT s’appeler Dockerfile.

Insérez-y le code suivant (nous le détaillerons par la suite) :

FROM alpine

RUN apk add --update nodejs

COPY ./app.js /app/

CMD [ "node", "/app/app.js" ]
  • FROM : C’est l’image de base utilisée pour créer notre image personnelle
  • RUN : Permet de lancer une ou plusieurs commandes au démarrage de notre container (ici, mise à jour des paquet puis installation de node).
    (Notons que “apk” est le gestionnaire de paquet pour Alpine (l’équivalent de “apt” sur Debian ou Ubuntu). “apk add” permet d’installer un paquet tout comme “apt install”. “apk update” remplace “apt update”. “apk add –update” permet en fait de d’abord faire “apk update” puis “apk add”. Ce qui correspond a “apt update && apt install” sur Debian et Ubuntu.)
  • COPY : Copie un fichier depuis la machine hôte vers l’image personnalisée.
    ATTENTION à bien mettre un dossier de destination en terminant par un /. Sans cela, cela sera considérer comme un fichier et nous ne pourrons pas lancer notre application, étant donner que nous chercherons un ficher inexistant.
  • CMD : Commande qui va lancée notre application.

Création d’un dossier “files” dans le dossier de notre Dockerfile puis y créer un fichier app.js dedans :

mkdir ./files
touch ./files/app.js

Création de notre “application” js dans le dossier ./files/app.js (elle va simplement afficher Bonjour ! dans la console) :

console.log("Bonjour !");

Attention également à bien utiliser les guillemets doubles et non simples dans CMD car ils permettent d’échapper les slashs.


Construire une image

Pour construire une image à partir d’un Dockerfile, il faut y appliquer la commande “build”.

Commande :
docker image build AppDir

Exemple :
docker image build ./docker/test/

Le processus de construction utilise un Dockerfile et un contexte. Le contexte est l’ensemble des fichiers contenus dans le chemin passé à la commande “docker image build”. Il y aura ainsi par exemple lors du build :

Sending build context to Docker daemon  3.51 MB

Ce qui signifie que les fichiers et les dossiers contenu dans le chemin passé en argument à la commande pèsent 3.51Mo.

C’est pour cette raison qu’il faut bien faire attention à créer le Dockerfile dans le dossier de votre application. Si par exemple il serait créer dans le dossier racine “/”, tout le contenu de votre disque dur serait envoyer comme contexte au deamon !

Le build est effectuer par le deamon Docker.

Si nous sommes directement dans le dossier de l’application, la commande devient tout simplement :

docker image build .

Attention à ne pas moublier le . à la fin qui signifie repertoire courrant.

Le résultat de la commande build pour l’application java écrite plus haut nous donne ceci en retour :

Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM alpine
latest: Pulling from library/alpine
188c0c94c7c5: Pull complete 
Digest: sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a
Status: Downloaded newer image for alpine:latest
  ---> d6e46aa2470d
Step 2/4 : RUN apk add --update nodejs
  ---> Running in bfa6e6159c03
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/8) Installing ca-certificates (20191127-r4)
(2/8) Installing brotli-libs (1.0.9-r1)
(3/8) Installing c-ares (1.16.1-r0)
(4/8) Installing libgcc (9.3.0-r2)
(5/8) Installing nghttp2-libs (1.41.0-r0)
(6/8) Installing libstdc++ (9.3.0-r2)
(7/8) Installing libuv (1.38.1-r0)
(8/8) Installing nodejs (12.18.4-r0)
Executing busybox-1.31.1-r19.trigger
Executing ca-certificates-20191127-r4.trigger
OK: 37 MiB in 22 packages
Removing intermediate container bfa6e6159c03
  ---> 00f5133d389e
Step 3/4 : COPY ./app.js /app
  ---> 5985a238bb14
Step 4/4 : CMD [ "node", '/app/app.js' ]
  ---> Running in 8f3fb48afa08
Removing intermediate container 8f3fb48afa08
  ---> 526fb4a033d6
Successfully built 526fb4a033d6

Tout sera décortiquer en détail dans les prochains chapitres.


Taguer une image

Pour donner un nom à une image, c’est ce que l’on appelle taguer ou donner un tag, il faut utiliesr l’option -t de la commande build:

docker image built -t node:latest .

Nous aurons cette foie (après avoir tout nettoyé avec la commande” docker system prune -a) :

Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM alpine
latest: Pulling from library/alpine
188c0c94c7c5: Pull complete 
Digest: sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a
Status: Downloaded newer image for alpine:latest
  ---> d6e46aa2470d
Step 2/4 : RUN apk add --update nodejs
  ---> Running in bc5c9a4cd53e
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/8) Installing ca-certificates (20191127-r4)
(2/8) Installing brotli-libs (1.0.9-r1)
(3/8) Installing c-ares (1.16.1-r0)
(4/8) Installing libgcc (9.3.0-r2)
(5/8) Installing nghttp2-libs (1.41.0-r0)
(6/8) Installing libstdc++ (9.3.0-r2)
(7/8) Installing libuv (1.38.1-r0)
(8/8) Installing nodejs (12.18.4-r0)
Executing busybox-1.31.1-r19.trigger
Executing ca-certificates-20191127-r4.trigger
OK: 37 MiB in 22 packages
Removing intermediate container bc5c9a4cd53e
  ---> d87483fefe3e
Step 3/4 : COPY ./app.js /app
  ---> 1f8aef922d23
Step 4/4 : CMD [ "node", '/app/app.js' ]
  ---> Running in 6af9582dba62
Removing intermediate container 6af9582dba62
  ---> ae97a4b96431
Successfully built ae97a4b96431
Successfully tagged node:latest

Lister notre image

Maintenant que notre image est build et tag, nous pouvons l’afficher en faisant :

docker image ls

Le nom de l’image est dans la colonne REPOSITORY et le tag sous la colonne TAG.

Nous pouvons à présent démarrer notre container à partir de notre image personnalisée :

docker run node

Image par défaut
administrateur
Publications: 25

Laisser un commentaire