Skip to content
Abderrachid BELLAALI edited this page May 15, 2022 · 5 revisions

Docker

Dans le cadre du projet, nous avons utilisé Docker car il est imposé, il est moins lourd qu'une machine virtuelle et les différentes configurations sont facilement transportables. Le container virtualise uniquement l'environnement d'exécution, tel que le processeur, la mémoire vive ou le système de fichiers. Il ne virtualise pas l'ensemble de la machine, notamment un nouvel OS comme le ferait une machine virtuelle, c'est ce qui fait son succès.

On utilise des images quand on a juste besoin de lancer un seul service comme DNS et VoIP. Par conséquent, il faut build l'image et la run.

Tant dis que pour les services Web, Mail et Intranet nous avons eu recours à des docker-compose car les plusieurs conteneurs doivent interagir entre eux.

Dockerfiles

Les Dockerfiles sont des fichiers qui permettent de construire une image Docker adaptée à nos besoins, étape par étape.

Voiçi un example du Dockerfile DNS :

FROM ubuntu:20.04

RUN apt update && apt full-upgrade -y \
    apt install bind9 bind9utils dnsutils net-tools nano -y

ENV TZ=Europe/Brussels
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

VOLUME /etc/bind

COPY named.conf /etc/bind/named.conf
COPY db.m1-5.ephec-ti.be /etc/bind/zones/db.m1-5.ephec-ti.be

EXPOSE 53/udp
EXPOSE 53/tcp

CMD ["named", "-c", "/etc/bind/named.conf", "-g"]

Construire l'image et lui donner un tag :

docker build -t <nom de l'image> .

Lancer l'image

docker run <nom de l'image> -d -p 53:53/tcp -p 53:53/udp

Afficher les conteneurs qui tournent.

docker ps

Interagir avec un conteneur

docker exec -ti <container-id> /bin/bash

Les instruction Dockerfile les plus importantes [1]

Instruction Description Commentaire
FROM Définir l’image de base Doit apparaître comme la première instruction ; une seule entrée par stade de build
ENV Définit les variables d’environnement pour le build process et le container runtime
ARG Déclare les paramètres de ligne de commande pour le build process Peut apparaître avant l’instruction FROM
WORKDIR Modifie le répertoire actuel
USER Modifie le statut de membre de l’utilisateur et de groupe
COPY Copie les fichiers et répertoires sur l’image Crée une nouvelle couche
ADD Copie les fichiers et répertoires sur l’image Crée une nouvelle couche ; utilisation déconseillée
RUN Exécute la commande dans l’image durant le build process Crée une nouvelle couche
CMD Définit les arguments par défaut pour le lancement du conteneur Une seule entrée par stade de build
ENTRYPOINT Définit la commande par défaut pour le lancement du conteneur Une seule entrée par stade de build
EXPOSE Définit les assignations de port pour le conteneur exécuté Les ports doivent être exposés lors du lancement du conteneur
VOLUME Inclut le répertoire dans l’image en tant que volume lors du lancement du conteneur dans le système hôte

Docker volume [2]

Avec un volume Docker, vous pouvez partager des données entre vos conteneurs ou sauvegarder les données d’un conteneur Docker de façon permanente.

Le système de fichiers Docker

Pour comprendre les volumes Docker, il est essentiel de savoir comment fonctionne le système de fichiers Docker.

Une image Docker est constituée de plusieurs couches, chacune d’elles en lecture seule. Pour toute image lancée depuis un conteneur, Docker ajoute une nouvelle couche inscriptible au système. Dans Docker, ce service est connu sous le nom d’« Union File System ».

Chaque fois qu’un fichier est modifié, Docker crée une copie de celui-ci à partir des couches en lecture seule, qu’il ajoute à la couche inscriptible supérieure. Le fichier original (en lecture seule) n’est donc pas modifié.

En supprimant un conteneur, vous perdrez également sa couche inscriptible supérieure. Cela signifie que toute modification effectuée après le lancement du conteneur est alors supprimée.

Résoudre les problèmes grâce aux volumes Docker

Un volume de conteneur vous permet de conserver vos données, même en cas de suppression d’un conteneur Docker. Il s’agit également d’une solution pratique pour l’échange de données entre l’hôte et le conteneur.

Nous vous conseillons d’opter pour un volume de conteneur Docker pour effectuer les opérations suivantes :

  • transférer des données vers un conteneur Docker ;
  • enregistrer des données depuis un conteneur Docker ;
  • partager des données entre vos conteneurs Docker.

Les volumes Docker n’appartiennent pas à l’« Union File System » (avec son accès en lecture seule et sa couche inscriptible). Un volume consiste plutôt en un dossier que se partagent le conteneur et l’ordinateur hôte. Plusieurs conteneurs peuvent également se partager un même volume.

docker network [3]

1. Le driver Bridge

Tout d'abord, lorsque vous installez Docker pour la première fois, il crée automatiquement un réseau bridge nommé bridge connecté à l'interface réseau docker0 ( consultable avec la commande ip addr show docker0 ). Chaque nouveau conteneur Docker est automatiquement connecté à ce réseau, sauf si un réseau personnalisé est spécifié.

Par ailleurs, le réseau bridge est le type de réseau le plus couramment utilisé. Il est limité aux conteneurs d'un hôte unique exécutant le moteur Docker. Les conteneurs qui utilisent ce driver, ne peuvent communiquer qu'entre eux, cependant ils ne sont pas accessibles depuis l'extérieur.

⚠️ Pour que les conteneurs sur le réseau bridge puissent communiquer ou être accessibles du monde extérieur, vous devez configurer le mappage de port.

2. Le driver none

C'est le type de réseau idéal, si vous souhaitez interdire toute communication interne et externe avec votre conteneur, car votre conteneur sera dépourvu de toute interface réseau (sauf l'interface loopback).

3. Le driver host

Ce type de réseau permet aux conteneurs d'utiliser la même interface que l'hôte. Il supprime donc l'isolation réseau entre les conteneurs et seront par défaut accessibles de l'extérieur. De ce fait, il prendra la même IP que votre machine hôte.

4. Le driver overlay

Si vous souhaitez une mise en réseau multi-hôte native, vous devez utiliser un driver overlay. Il crée un réseau distribué entre plusieurs hôtes possédant le moteur Docker. Docker gère de manière transparente le routage de chaque paquet vers et depuis le bon hôte et le bon conteneur.

5. Le driver macvlan

L'utilisation du driver macvlan est parfois le meilleur choix lorsque vous utilisez des applications qui s'attendent à être directement connectées au réseau physique, car le driver Macvlan vous permet d'attribuer une adresse MAC à un conteneur, le faisant apparaître comme un périphérique physique sur votre réseau. Le moteur Docker route le trafic vers les conteneurs en fonction de leurs adresses MAC.


Sources :

  1. https://www.ionos.fr/digitalguide/serveur/know-how/dockerfile/
  2. https://www.ionos.fr/digitalguide/serveur/know-how/volumes-de-conteneurs-docker/
  3. https://devopssec.fr/article/fonctionnement-manipulation-reseau-docker

Clone this wiki locally