-
Notifications
You must be signed in to change notification settings - Fork 0
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.
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
| 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 | — |
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.
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.
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.
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.
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).
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.
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.
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.