Comment créer mes images Docker ?

Dockeriser vos applications est un exercice très important. En effet une image docker est globalement l’équivalent des traditionnels packages sur (Gnu/Linux) .deb .rpm … mais ce n’est pas tout.
Dans une image Docker vous pouvez accumuler plusieurs applications qui travaillent ensemble pour délivrer un service.
Par exemple, un site Wordpress est un service. Mais derrière les rideaux, il faut un php-fpm, Nginx, Mariadb. une image Docker est donc l’ensemble de ces applications.

docker image

Tu m'expliques ?

Quand on crée une image Docker, on utilise généralement une autre image de base sur laquelle on exécute des commandes. Ça fonctionne un peu de la même manière que de prendre une machine, d’installer tous les programmes requis et de les configurer.

Comme pour une machine vous pouvez choisir n’importe quel OS, Debian, OpenSuse, Ubuntu …etc, pour une image Docker vous pouvez aussi choisir l’image de base de l’OS que vous voulez utiliser.
Cependant dans un conteneur le but est de minimiser la taille de l’image et le nombre de programmes présents.

Pour ma part, je considère que si vous vous limitez aux programmes requis pour délivrer votre service, vous gagnerez en performance, en sécurité et en dépendances.

  • La taille est importante, car lors du déploiement, l’image est téléchargée depuis un serveur, il est donc plus facile de télécharger et décompresser 50Mo sur plusieurs serveurs que télécharger des images de 800Mo.

  • En termes de sécurité c’est plus simple, car plus il y a de programmes qui s’exécutent dans votre conteneur, plus vous courez un risque de failles présentes dans ce programme. Donc moins il y a de programmes, moins il y aura de failles.

  • Le choix de l’image de base est aussi importante. Pour ma part je considère qu'Alpine Linux est une bonne distribution minimaliste. Elle est orientée sécurité et est souvent utilisée pour le build de conteneurs.

Ce n’est pas la seule raison ! En effet, les images Docker officielles sont désormais construites à base d’Alpine selon un article de Brian Christner paru sur son site web. C’est donc aussi intéressant en termes d’homogénéité.
Voir l’article de Brian Christner

Bon c’est bien beau tout ça, mais comment je fais ?

Tout d’abord, il vous faut un répertoire. Dans mon cas : ~/mon_image/

Pour builder une image, il vous faut une sorte de script, les commandes listées dans ce script vont s’exécuter dans un contexte, à chaque commande réussie, docker va créer une image à cet instant, votre image finale sera une pile d’images intermédiaires, c’est pour ça que lorsque vous faites un pull d’une image, vous voyez ceci :

samir@ps1:~/mon_image/$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f7e2b70d04ae: Downloading  3.894MB/22.5MB # image de base
08dd01e3f3ac: Downloading  4.144MB/22.26MB # résultat de la première commande 
d9ef3a1eb792: Download complete  # résultat de la deuxième commande

Dans ce répertoire, créez un fichier qui s’appelle Dockerfile
Ouvrez-le, et mettez en premier l’image de base, ici Alpine:

FROM alpine

Ensuite, enchaînez les commande à exécuter, ici l’installation de nginx et de php-fpm

FROM alpine
RUN apk update
RUN apk add php-fpm
RUN apk add nginx

Ensuite, enregistrez le fichier puis dans la ligne de commandes, exécutez cette commande:

samir@ps1:~/mon_image/$ docker build . -t mon_image 
Sending build context to Docker daemon  2.761MB
Step 1/4 : FROM alpine
 ---> 3f53bb00af94
Step 2/4 : RUN apk update
 ---> Running in dd067de97ece
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
v3.8.4-3-g074d7e8c77 [http://dl-cdn.alpinelinux.org/alpine/v3.8/main]
v3.8.4-3-g074d7e8c77 [http://dl-cdn.alpinelinux.org/alpine/v3.8/community]
OK: 9549 distinct packages available
Removing intermediate container dd067de97ece
 ---> 4032d79fdef8
Step 3/4 : RUN apk add php-fpm
 ---> Running in 23b024a83e5d
(1/8) Installing php7-common (7.2.13-r0)
(2/8) Installing ncurses-terminfo-base (6.1_p20180818-r1)
(3/8) Installing ncurses-terminfo (6.1_p20180818-r1)
(4/8) Installing ncurses-libs (6.1_p20180818-r1)
(5/8) Installing libedit (20170329.3.1-r3)
(6/8) Installing pcre (8.42-r0)
(7/8) Installing libxml2 (2.9.8-r1)
(8/8) Installing php7-fpm (7.2.13-r0)
Executing busybox-1.28.4-r2.trigger
OK: 18 MiB in 21 packages
Removing intermediate container 23b024a83e5d
 ---> de249ba1ba99
Step 4/4 : RUN apk add nginx
 ---> Running in 0bba7b5f8378
(1/1) Installing nginx (1.14.2-r0)
Executing nginx-1.14.2-r0.pre-install
Executing busybox-1.28.4-r2.trigger
OK: 19 MiB in 22 packages
Removing intermediate container 0bba7b5f8378
 ---> 1a4e46c5aa10
Successfully built 1a4e46c5aa10
Successfully tagged mon_image:latest

Voila, à présent votre image est prête et elle a été nommée mon_image .

Il existe plusieurs autres commandes supportées dans les Dockerfile, ADD, COPY pour copier un répertoire de votre machine à l’intérieur de l’image par exemple.
La liste complète se trouve ici, allez-y, jetez un coup d’œil, c’est très bien documenté.

2915

Article suivant