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-ceest le moteur. (cepour community edition)docker-ce-clipour la command line interfacecontainerd.ioc’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 !