Conception d'Images Docker Personnalisées et Architecture en Couches

Pour créer une image système de base personnalisée, nous utilisons une distribution Linux moderne. Voici un exemple avec Rocky Linux 8, qui rempalce avantageusement les anciennes versions de CentOS pour des environnements de production actuels.

# Image de base du système d'exploitation
FROM rockylinux:8
RUN dnf install -y epel-release && \
    dnf install -y gcc make pcre-devel openssl-devel zlib-devel wget vim net-tools && \
    dnf clean all && \
    ln -sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
CMD ["/bin/bash"]

Construction de l'image de base :

docker build -t rockylinux-base:8.0 .

Ensuite, nous compilons Nginx à partir des sources en utilisant cette image de base. Cette approche permet d'optimiser la taille et les dépendances spécifiques au serveur web.

# Image avec Nginx compilé
FROM rockylinux-base:8.0
ADD https://nginx.org/download/nginx-1.24.0.tar.gz /tmp/
RUN cd /tmp && \
    tar -xzf nginx-1.24.0.tar.gz && \
    cd nginx-1.24.0 && \
    ./configure --prefix=/opt/nginx --with-http_ssl_module && \
    make && make install && \
    rm -rf /tmp/nginx* && \
    useradd -M -s /sbin/nologin nginx
COPY custom_nginx.conf /opt/nginx/conf/nginx.conf
EXPOSE 80 443
CMD ["/opt/nginx/sbin/nginx", "-g", "daemon off;"]

Construction de l'image Nginx :

docker build -t nginx-custom:1.24.0 .

Les 10 instructions fondamentales du Dockerfile

  • FROM : Spécifie l'image de base à partir de laquelle la nouvelle image est construite.
  • RUN : Exécute une commande dans une nouvelle couche au-dessus de l'image actuelle et valide le résultat en tant que nouvelle couche.
  • CMD : Fournit les valeurs par défaut pour un conteneur en cours d'exécution. Peut être écrasé lors de l'exécution de la commande docker run.
  • ENTRYPOINT : Configure le conteneur pour qu'il s'exécute comme un exécutable spécifique. Les arguments de docker run sont ajoutés après la commande ENTRYPOINT.
  • EXPOSE : Informe Docker que le conteneur écoute sur les ports réseau spécifiés au moment de l'exécution. Cela n'effectue pas réellement la publication des ports.
  • ENV : Définit une variable d'environnement qui sera disponible dans les couches suivantes et dans le conteneur en cours d'exécution.
  • COPY : Copie des fichiers ou des répertoires depuis le contexte de construction local vers le système de fichiers de la nouvelle image.
  • ADD : Similaire à COPY, mais prend également en charge la récupération de fichiers depuis des URL distantes et l'extraction automatique des archives tar.
  • VOLUME : Crée un point de montage avec un nom spécifié et le marque comme contenant des volumes externes natifs au système hôte.
  • USER : Définit le nom d'utilisateur ou l'UID à utiliser lors de l'exécution de l'image et pour toutes les instructions RUN, CMD et ENTRYPOINT suivantes.

Principe de l'architecture en couches de Docker

Les images Docker sont construites sur un système de fichiers en couches. Chaque instruction dans le Dockerfile crée une couche en lecture seule. Lorsqu'un conteneur est démarré, Docker ajoute une couche inscriptible (également appelée couche de conteneur) au sommet de toutes les couches de l'image.

Docker utilise le mécanisme de copie à l'écriture (Copy-on-Write). Si un conteneur doit modifier un fichier existant, ce fichier est d'abord copié de la couche en lecture seule vers la couche inscriptible du conteneur. Les modifications sont ensuite appliquées à cette copie.

Cela signifie que l'image de base n'est jamais altérée. Plusieurs conteneurs peuvent partager la même image de base tout en ayant leurs propres espaces d'écriture isolés. Lorsque le conteneur est arrêté et supprimé, seule la couche inscriptible est détruite. L'image de base reste intacte, ce qui optimise considérablement l'utilisation du disque et permet des déploiemetns rapides.

Étiquettes: Docker Dockerfile containerization Linux nginx

Publié le 6 octobre à 17h56