6.8 KiB
6.8 KiB
date
| date |
|---|
| 2025-03-06 |
Docker
Virtualisation
- VirtualBox
- VMWare
- VSphere
- Proxmox
--
Architecture
!Pasted image 20250305170955.png
--
Hyperviseur type 1 (natif)
--
Hyperviseur type 2 (hosted)
--
Avantages
- Isolation complète
- OS / noyau complètement émulés
- Tests sur OS spécifiques
- Lancer un logiciel non supporté
- Environnment reproductible
- Image partagée en ISO
- Ressources disponibles fixes et programmables
Docker
arrive
--
Docker
- Emuler un OS
- Sur un autre OS
- De manière reproductible
--
VMs vs Containers
Les différences !Pasted image 20250305172704.png
- Pas d'hyperviseur
- usage direct de l'hôte pour l'émulation
- Les outils sont partagés également
--
Avantages par rapport aux VMs
- Légèreté
- Moins de choses dans un container que dans un iso
- Rapidité
- De mise en route, d'exécution et de destruction
- containers = VM jetables à la volée
- Flexibilité dans l'usage des ressources
--
Inconvénients par rapport aux VMs
- Isolation partielle
- Sécurité
- Pas de ressources fixes
--
VM ou container ?
VM si:
- Besoin d'une isolation complète
- D'accéder aux éléments intrinsèques d'un OS (kernel, libs, ...)
- Usage en ressources prédéfini
Docker si:
- Isolation partielle suffisante
- "Juste" besoin d'une machine indépendante
- Flexibilité (ressources, network, etc.)
--
C'est pas tout
Docker rend programmable un tas de trucs
- Création et le partage d'images
- La mise en réseau des containers
- Le partage de variables, de filesystem avec l'hôtes
- ...
Docker
Les engrenages
Fonctionnement général
!Pasted image 20250305175750.png
Images
- Représentation d'un OS et d'un système de fichier déjà préparé
- Moyen principal de partage d'environnement
- Template pour les containers
- Container = instance d'image
docker image ls
--
Créer son image
Avec un Dockerfile!
FROM python:3.12
WORKDIR /usr/local/app
# Install the application dependencies
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# Copy in the source code
COPY src ./src
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
docker build .- Mais où est l'OS là dedans ?
--
Images de base
--
Layers
!Pasted image 20250305180252.png
--
En résumé
- Les images décrivent comment créer un container, sur quel OS, etc.
- Les images encapsulent et compressent notre application
- Partagées et versionnées en layers
- Décrites à l'aide d'un Dockerfile
docker buildpour compiler le Dockerfile en image
Containers
--
Instance d'image
- On peut avoir plusieurs containers qui lancent la même image
- C'est même le principe de Kubernetes
- Uniques par leur container layer mais c'est tout
docker run
--
Examples
docker run busyboxdocker run busybox:latestdocker run busybox bash
--
Les paramètres d'un container
- L'image (obligatoire) et son tag (optionnel)
- Les variables d'environnement
- Les volumes
- Les ports
- Le network
- Et plus encore
--
Variables d'environnement
- Permet de définir sur la container layer une variable d'environnement au moment de la création du container
- Pratique pour paramétrer une application
docker run -eoudocker run --env-file
--
Examples
docker run -e TEST=coucou busyboxdocker run -e USER=alex -e PASSWORD=whoops busyboxdocker run --env-file=./.env busybox
--
Volumes
- Espace de stockage persistant
- Peut-être nommé ou anonyme
- Permet de monter le filesystem hôte sur celui du container
docker volume
--
Examples
docker volume lsdocker volume create myvolumedocker run -v myvolume:/data:ro busybox:latestdocker run -v ./src:/app busybox:latest
--
Ports
- Par défaut, le container est complètement isolé
- On peut ouvrir certains ports pour réseaux pour échanger du traffic
- On map un port de l'hôte vers un port du container
docker run --port
--
Exemples
docker run --port 8080:80 nginxdocker run -p 8081:80 nginxdocker run -p 8082:80 nginx
--
Network
- Les containers peuvent être connectés sur un réseau dédié
- Permet de connecter les containers entre eux en les gardant isolés de l'hôte
- Permet de simuler des architectures réseau
docker network
--
Exemples
docker network lsdocker network create --ipv4 --subnet 172.18.0.0/24 v4netdocker network create --ipv6 --subnet 2001:db8::/64 v6netdocker run --network=v6net -p 8080:80 nginx
--
Autres paramètres
- healthcheck
- entrypoint
- command
- cpus
- memory
- labels
- ...
Registries
--
Container registry
- Permet de partager des images
- Mais aussi de les versionner avec les tags
- Docker hub
- ghcr.io - GitHub Container Registry
--
Télécharger une image
docker image pulldocker pull- Implicitement lancé par
docker runsi l'image n'existe pas sur l'hôte
--
Uploader une image
docker image pushdocker push- Une image DOIT être taggée pour être uploadée avec
docker image tag
--
En pratique
On utilise rarement pull directement
On utilise souvent une CI pour push
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v6
with:
push: true
tags: user/app:latest
Infrastructure as Code
IaC
--
Le problème
- On veut mettre en place, maintenir et étendre une infrastructure avec Docker
- Toutes ces commandes Docker sont difficiles à retenir et reproduire
- Elles ne sont pas versionnables
--
Solution 1 - script
- Écrire les commandes dans un script bash
- OS spécifique
- Difficilement idempotent (programmation impérative)
--
Solution 2 - python
- Utiliser un script python
- OS agnostique
- Toujours impérative
--
Solution 3 - IaC
- Programmation déclarative
- On écrit ce qu'on veut, pas comme y arriver
- OS agnostique
--
Terraform / OpenTofu
- Outil populaire de IaC
- Extremement puissant et modulable
- Écrit en HCL
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-bucket"
acl = "private"
}
--
Docker Compose
- Natif avec Docker
- Utilise du YAML (plus standard que HCL)

