Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Conteneurisation Docker

Motivation

Un monde sans docker

Tiens, voici mon code source ! J’ai testé sur ma machine, ça marche.

🧑‍💻

Merci, mais j’ai essayé de le compiler chez moi et j’ai des erreurs de version.

❌🕵️

Un monde avec docker

Tiens, voici mon programme, je te donne une image docker.

🧑‍💻

Merci, j’ai lancé docker run tonsuperprogramme et j’adore.

✅🕵️

Bref, on fournit du code reproductible et facile à installer/déployer. C’est important aussi en recherche scientifique.

Installation

    sudo apt install docker-ce docker-ce-cli container.io
  • docker-ce est le moteur. (ce pour community edition)
  • docker-ce-cli pour la command line interface
  • containerd.io c’est le daemon qui fait les choses techniques

Mise en place

Le logiciel docker utilise un groupe d’utilisateurs qui s’appelle aussi… docker. Ainsi, le plus simple est d’ajouter l’utilisateur courant à ce groupe. On peut vérifier que l’utilisateur docker existe en faisant less /etc/group. Le fichier /etc/group contient les groupes et less permet d’afficher le contenu du fichier. Au besoin, on ajoute l’utilisateur en faisant sudo groupadd docker.

Pour ajouter l’utilisateur courant au groupe docker :

    sudo usermod -a -G docker $USER
    newgrp docker

Le programme usermod permet de changer les droits d’utilisateurs, -a permet d’ajouter un utilisateur à un groupe indiqué après le -G. La variable $USER contient l’utilisateur courant.

Mon premier exemple

Ubuntu

La commande suivante lance un terminal dans un système Ubuntu (même si vous êtes sur un autre système !) :

docker run -it ubuntu bash

Les drapeaux -it c’est pour -i (je veux pouvoir écrire dans le terminal), et -t (affiche moi un terminal).

Ca c’est le début pour donner un programme qui marche bien sous Ubuntu et qui s’installe bien avec le gestionnaire apt, même si vous êtes sous Fedora !

NGinx

    # Lancer Nginx en mode détaché sur le port 8080
    docker run -d -p 8080:80 --name mon-nginx nginx

    # Vérifier que le conteneur tourne bien
    docker ps

    # Ouvrir votre navigateur sur http://localhost:8080
    # Vous devriez voir la page d'accueil Nginx

    # Consulter les logs du serveur
    docker logs mon-nginx

    # Arrêter et supprimer le conteneur
    docker stop mon-nginx
    docker rm mon-nginx

Créer son image Docker

Dockerfile

Un dockerfile est un fichier qui décrit comment construire une image docker.

# Image de base légère avec Node.js
FROM node:18-alpine

# Définir le répertoire de travail dans le conteneur
WORKDIR /app

# Copier les fichiers de dépendances
COPY package*.json ./

# Installer les dépendances de l'application
RUN npm install

# Copier tout le code source de l'application
COPY . .

# Exposer le port sur lequel l'application écoute (3000 est un port interne).
# (remarque : le port de la machine hôte peut se décide dans la commande docker run)
EXPOSE 3000

# Commande à exécuter au démarrage du conteneur
CMD ["node", "server.js"]

Création de l’image

# Construire l'image avec un tag
docker build -t mon-app:1.0 .

# Vérifier que l'image a bien été créée
docker images

Lancer son image

# Lancer un conteneur à partir de cette image
# 5000 est le port de la machine hôte
# 3000 est le port interne dans le conteneur
docker run -d -p 5000:3000 --name mon-app-container mon-app:1.0

# Tester que l'application répond
curl http://localhost:5000

# Consulter les logs de l'application
docker logs mon-app-container

Commandes pour gérer les images

# Lister toutes les images présentes localement
docker images

# Télécharger une image depuis Docker Hub
docker pull nginx

# Supprimer une image locale
docker rmi nginx

# Construire une image personnalisée depuis un Dockerfile
docker build -t mon-app:v1 .

# Rechercher une image sur Docker Hub
docker search python

Commandes pour gérer les conteneurs

# Lister les conteneurs actuellement en cours d'exécution
docker ps

# Lister tous les conteneurs (y compris ceux qui sont arrêtés)
docker ps -a

# Arrêter un conteneur en cours d'exécution
docker stop <container-id>

# Démarrer un conteneur précédemment arrêté
docker start <container-id>

# Supprimer définitivement un conteneur
docker rm <container-id>

# Consulter les logs d'un conteneur
docker logs <container-id>

# Exécuter une commande dans un conteneur déjà en cours
docker exec -it <container-id> bash

Composition de conteneurs

Jusqu’à présent, on utilise qu’une seul conteneur. Mais beaucoup d’applications ont plusieurs conteneurs. Par exemple :

  • Un conteneur est l’application Web
  • Un autre conteneur est une base de données (PostGreSQL par exemple)

On utilise alors docker compose pour faire parler plusieurs conteneurs. On parle d’orchestration.

Installation

        sudo apt install docker-compose

Utilisation

On crée un fichier docker-compose.yml qui décrit les services (les conteneurs) de notre application. Là, on a deux conteneurs : une conteneur application Python qui communique avec un conteneur PostgreSQL.

services:
  # 1. Le conteneur de l'application Python
  app:
    build: .
    ports:
      - "5000:5000"
    environment:
      - DB_HOST=postgres_db  # <-- On pointe vers le nom du service ci-dessous
      - DB_NAME=ma_base
      - DB_USER=postgres
      - DB_PASSWORD=mon_mot_de_passe
    # C'EST ICI QUE LA MAGIE OPÈRE :
    volumes:
      - .:/app
    depends_on:
      - postgres_db

  # 2. Le conteneur PostgreSQL (dans une autre image)
  postgres_db:
    image: postgres:latest
    environment:
      - POSTGRES_DB=ma_base
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=mon_mot_de_passe
    ports:
      - "5432:5432"
ports:
      - "8000:5000"

veut par exemple dire que le port 8000 de la vraie machine est connecté au port 5000 de l’image.

Lancement

Pour lancer le tout, on fait :

    docker compose up

Magnifique !