informatique:docker
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédente | |||
| informatique:docker [2025/12/16 13:45] – [4.10 Stopping : comment Docker arrête un conteneur] john | informatique:docker [2025/12/16 13:48] (Version actuelle) – john | ||
|---|---|---|---|
| Ligne 163: | Ligne 163: | ||
| Schéma conceptuel : | Schéma conceptuel : | ||
| - | ``` | + | |
| [ Docker CLI ] → (API HTTP) → [ Docker Daemon ] | [ Docker CLI ] → (API HTTP) → [ Docker Daemon ] | ||
| ↓ | ↓ | ||
| Ligne 171: | Ligne 171: | ||
| ↓ | ↓ | ||
| [ Registries ] | [ Registries ] | ||
| - | ``` | + | |
| Docker est construit autour d’une architecture client/ | Docker est construit autour d’une architecture client/ | ||
| Ligne 205: | Ligne 205: | ||
| Structure : | Structure : | ||
| - | ``` | + | |
| *Layer 5 — CMD / ENTRYPOINT | *Layer 5 — CMD / ENTRYPOINT | ||
| *Layer 4 — Code source | *Layer 4 — Code source | ||
| Ligne 211: | Ligne 211: | ||
| *Layer 2 — Paquets système supplémentaires | *Layer 2 — Paquets système supplémentaires | ||
| *Layer 1 — Base OS (alpine, debian, python: | *Layer 1 — Base OS (alpine, debian, python: | ||
| - | ``` | + | |
| ==== Caractéristiques clés ==== | ==== Caractéristiques clés ==== | ||
| Ligne 220: | Ligne 220: | ||
| Commande pour voir les layers : | Commande pour voir les layers : | ||
| - | ``` | + | |
| docker history nginx | docker history nginx | ||
| - | ``` | + | |
| ----- | ----- | ||
| Ligne 231: | Ligne 231: | ||
| Schéma : | Schéma : | ||
| - | ``` | + | |
| IMAGE (read-only) | IMAGE (read-only) | ||
| ▲ layers immuables | ▲ layers immuables | ||
| | | | | ||
| CONTAINER (read-write) | CONTAINER (read-write) | ||
| - | ``` | + | |
| Lorsqu’un fichier est modifié dans le conteneur : | Lorsqu’un fichier est modifié dans le conteneur : | ||
| Ligne 255: | Ligne 255: | ||
| Cycle de vie : | Cycle de vie : | ||
| - | ``` | + | |
| docker create | docker create | ||
| docker start | docker start | ||
| Ligne 262: | Ligne 262: | ||
| docker kill | docker kill | ||
| docker rm | docker rm | ||
| - | ``` | + | |
| Commande pour inspecter un conteneur : | Commande pour inspecter un conteneur : | ||
| - | ``` | + | |
| docker inspect mon_container | docker inspect mon_container | ||
| - | ``` | + | |
| ----- | ----- | ||
| Ligne 286: | Ligne 286: | ||
| Schéma : | Schéma : | ||
| - | ``` | + | |
| [ Host OS ] | [ Host OS ] | ||
| | | ||
| | | ||
| | | ||
| - | ``` | + | |
| ----- | ----- | ||
| Ligne 304: | Ligne 304: | ||
| Exemples : | Exemples : | ||
| - | ``` | + | |
| docker run --memory=" | docker run --memory=" | ||
| docker run --cpus=" | docker run --cpus=" | ||
| - | ``` | + | |
| On peut donc isoler les ressources de chaque conteneur. | On peut donc isoler les ressources de chaque conteneur. | ||
| Ligne 324: | Ligne 324: | ||
| ==== Vérification du driver utilisé ==== | ==== Vérification du driver utilisé ==== | ||
| - | ``` | + | |
| docker info | grep Storage | docker info | grep Storage | ||
| - | ``` | + | |
| Sous Linux (Ubuntu), Docker utilise **overlay2**. | Sous Linux (Ubuntu), Docker utilise **overlay2**. | ||
| Ligne 344: | Ligne 344: | ||
| ==== Commandes ==== | ==== Commandes ==== | ||
| - | ``` | + | |
| docker pull nginx | docker pull nginx | ||
| docker push johnben/ | docker push johnben/ | ||
| docker login | docker login | ||
| - | ``` | + | |
| ----- | ----- | ||
| Ligne 354: | Ligne 354: | ||
| ===== 2.9 Interaction CLI ↔ Daemon ↔ Conteneur ===== | ===== 2.9 Interaction CLI ↔ Daemon ↔ Conteneur ===== | ||
| - | ``` | + | |
| docker run nginx | docker run nginx | ||
| ↓ | ↓ | ||
| Ligne 366: | Ligne 366: | ||
| ↓ | ↓ | ||
| Lancement du processus principal (ENTRYPOINT/ | Lancement du processus principal (ENTRYPOINT/ | ||
| - | ``` | + | |
| ----- | ----- | ||
| Ligne 373: | Ligne 373: | ||
| Sous Linux : | Sous Linux : | ||
| - | ``` | + | |
| journalctl -u docker | journalctl -u docker | ||
| - | ``` | + | |
| Sous macOS : | Sous macOS : | ||
| Ligne 414: | Ligne 414: | ||
| ==== Exercice 3 — Observer les namespaces ==== | ==== Exercice 3 — Observer les namespaces ==== | ||
| Depuis le conteneur : | Depuis le conteneur : | ||
| - | ``` | + | |
| docker exec -it test-nginx sh | docker exec -it test-nginx sh | ||
| - | ``` | + | |
| Tester : | Tester : | ||
| - | ``` | + | |
| ps aux | ps aux | ||
| hostname | hostname | ||
| - | ``` | + | |
| ----- | ----- | ||
| Ligne 543: | Ligne 543: | ||
| Définit l’image de base. | Définit l’image de base. | ||
| Exemples : | Exemples : | ||
| - | ``` | + | |
| FROM node: | FROM node: | ||
| FROM python: | FROM python: | ||
| FROM ubuntu: | FROM ubuntu: | ||
| - | ``` | + | |
| Meilleures pratiques : | Meilleures pratiques : | ||
| Ligne 558: | Ligne 558: | ||
| ==== WORKDIR ==== | ==== WORKDIR ==== | ||
| Définit le répertoire de travail. | Définit le répertoire de travail. | ||
| - | ``` | + | |
| WORKDIR /app | WORKDIR /app | ||
| - | ``` | + | |
| Avantages : | Avantages : | ||
| Ligne 570: | Ligne 570: | ||
| ==== COPY ==== | ==== COPY ==== | ||
| Copie des fichiers dans l’image. | Copie des fichiers dans l’image. | ||
| - | ``` | + | |
| COPY . . | COPY . . | ||
| COPY src/ /app/src/ | COPY src/ /app/src/ | ||
| COPY package*.json ./ | COPY package*.json ./ | ||
| - | ``` | + | |
| Points importants : | Points importants : | ||
| Ligne 584: | Ligne 584: | ||
| ==== RUN ==== | ==== RUN ==== | ||
| Exécute des commandes lors du build. | Exécute des commandes lors du build. | ||
| - | ``` | + | |
| RUN apt update && apt install -y curl | RUN apt update && apt install -y curl | ||
| - | ``` | + | |
| Bonnes pratiques : | Bonnes pratiques : | ||
| Ligne 597: | Ligne 597: | ||
| ==== ENV ==== | ==== ENV ==== | ||
| Définit une variable d’environnement dans l’image. | Définit une variable d’environnement dans l’image. | ||
| - | ``` | + | |
| ENV NODE_ENV=production | ENV NODE_ENV=production | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 607: | Ligne 607: | ||
| === CMD === | === CMD === | ||
| Commande utilisée par défaut si aucune autre n’est fournie. | Commande utilisée par défaut si aucune autre n’est fournie. | ||
| - | ``` | + | |
| CMD [" | CMD [" | ||
| - | ``` | + | |
| === ENTRYPOINT === | === ENTRYPOINT === | ||
| Commande forcée, non écrasable. | Commande forcée, non écrasable. | ||
| - | ``` | + | |
| ENTRYPOINT [" | ENTRYPOINT [" | ||
| CMD [" | CMD [" | ||
| - | ``` | + | |
| Exécution : | Exécution : | ||
| Ligne 630: | Ligne 630: | ||
| Exemple Node.js : | Exemple Node.js : | ||
| - | ``` | + | |
| FROM node: | FROM node: | ||
| WORKDIR /app | WORKDIR /app | ||
| Ligne 641: | Ligne 641: | ||
| COPY --from=build /app . | COPY --from=build /app . | ||
| CMD [" | CMD [" | ||
| - | ``` | + | |
| Avantages : | Avantages : | ||
| Ligne 654: | Ligne 654: | ||
| Bonnes pratiques 2025 : | Bonnes pratiques 2025 : | ||
| * ne jamais exécuter en root : | * ne jamais exécuter en root : | ||
| - | | + | |
| RUN adduser -D appuser | RUN adduser -D appuser | ||
| USER appuser | USER appuser | ||
| - | | + | |
| * limiter les outils installés | * limiter les outils installés | ||
| * scanner les images : | * scanner les images : | ||
| - | | + | |
| docker scan monimage | docker scan monimage | ||
| - | | + | |
| * utiliser des bases officielles minimalistes (alpine, slim, distroless) | * utiliser des bases officielles minimalistes (alpine, slim, distroless) | ||
| Ligne 674: | Ligne 674: | ||
| * multi-stage | * multi-stage | ||
| * nettoyer les caches : | * nettoyer les caches : | ||
| - | | + | |
| RUN rm -rf / | RUN rm -rf / | ||
| - | | + | |
| ==== Optimiser le build ==== | ==== Optimiser le build ==== | ||
| Ligne 729: | Ligne 729: | ||
| ==== 1. Créer un répertoire ==== | ==== 1. Créer un répertoire ==== | ||
| - | ``` | + | |
| mkdir docker-app | mkdir docker-app | ||
| cd docker-app | cd docker-app | ||
| - | ``` | + | |
| ==== 2. Ajouter un fichier app.py ==== | ==== 2. Ajouter un fichier app.py ==== | ||
| - | ``` | + | |
| print(" | print(" | ||
| - | ``` | + | |
| ==== 3. Créer un Dockerfile ==== | ==== 3. Créer un Dockerfile ==== | ||
| - | ``` | + | |
| FROM python: | FROM python: | ||
| WORKDIR /app | WORKDIR /app | ||
| COPY . . | COPY . . | ||
| CMD [" | CMD [" | ||
| - | ``` | + | |
| ==== 4. Builder l’image ==== | ==== 4. Builder l’image ==== | ||
| - | ``` | + | |
| docker build -t monpython: | docker build -t monpython: | ||
| - | ``` | + | |
| ==== 5. Lancer l’image ==== | ==== 5. Lancer l’image ==== | ||
| - | ``` | + | |
| docker run monpython: | docker run monpython: | ||
| - | ``` | + | |
| ==== Résultat attendu ==== | ==== Résultat attendu ==== | ||
| Ligne 800: | Ligne 800: | ||
| Schéma : | Schéma : | ||
| - | ``` | + | |
| IMAGE (read-only layers) | IMAGE (read-only layers) | ||
| │ | │ | ||
| Ligne 808: | Ligne 808: | ||
| ▼ | ▼ | ||
| Processus principal (ENTRYPOINT/ | Processus principal (ENTRYPOINT/ | ||
| - | ``` | + | |
| Un conteneur **vit tant que SON PROCESSUS PRINCIPAL est en vie**. | Un conteneur **vit tant que SON PROCESSUS PRINCIPAL est en vie**. | ||
| Ligne 857: | Ligne 857: | ||
| ==== Détaché (-d) ==== | ==== Détaché (-d) ==== | ||
| - | ``` | + | |
| docker run -d nginx | docker run -d nginx | ||
| - | ``` | + | |
| ==== Nom personnalisé (--name) ==== | ==== Nom personnalisé (--name) ==== | ||
| - | ``` | + | |
| docker run --name web nginx | docker run --name web nginx | ||
| - | ``` | + | |
| ==== Ports (-p) ==== | ==== Ports (-p) ==== | ||
| Mapping : | Mapping : | ||
| - | ``` | + | |
| -p HOST: | -p HOST: | ||
| - | ``` | + | |
| Exemple : | Exemple : | ||
| - | ``` | + | |
| docker run -d -p 8080:80 nginx | docker run -d -p 8080:80 nginx | ||
| - | ``` | + | |
| → http:// | → http:// | ||
| ==== Variables d’environnement (-e) ==== | ==== Variables d’environnement (-e) ==== | ||
| - | ``` | + | |
| docker run -e APP_ENV=prod monapp | docker run -e APP_ENV=prod monapp | ||
| - | ``` | + | |
| ==== Mode interactif (-it) ==== | ==== Mode interactif (-it) ==== | ||
| - | ``` | + | |
| docker run -it ubuntu bash | docker run -it ubuntu bash | ||
| - | ``` | + | |
| ==== Volume (-v) ==== | ==== Volume (-v) ==== | ||
| Ligne 917: | Ligne 917: | ||
| ==== Métadonnées complètes ==== | ==== Métadonnées complètes ==== | ||
| - | ``` | + | |
| docker inspect moncontainer | docker inspect moncontainer | ||
| - | ``` | + | |
| Parties importantes : | Parties importantes : | ||
| Ligne 928: | Ligne 928: | ||
| ==== Obtenir uniquement l’IP ==== | ==== Obtenir uniquement l’IP ==== | ||
| - | ``` | + | |
| docker inspect -f '{{ .NetworkSettings.IPAddress }}' moncontainer | docker inspect -f '{{ .NetworkSettings.IPAddress }}' moncontainer | ||
| - | ``` | + | |
| ---- | ---- | ||
| ===== 4.7 Voir les logs ===== | ===== 4.7 Voir les logs ===== | ||
| - | ``` | + | |
| docker logs moncontainer | docker logs moncontainer | ||
| docker logs -f moncontainer | docker logs -f moncontainer | ||
| - | ``` | + | |
| Options utiles : | Options utiles : | ||
| Ligne 968: | Ligne 968: | ||
| Vérifier : | Vérifier : | ||
| - | ``` | + | |
| docker top moncontainer | docker top moncontainer | ||
| - | ``` | + | |
| Dans un OS classique : | Dans un OS classique : | ||
| - | ``` | + | |
| ps aux | ps aux | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 995: | Ligne 995: | ||
| Schéma : | Schéma : | ||
| - | ``` | + | |
| HOST : 8080 → CONTAINER : 80 | HOST : 8080 → CONTAINER : 80 | ||
| - | ``` | + | |
| Commande : | Commande : | ||
| - | ``` | + | |
| docker run -p 8080:80 nginx | docker run -p 8080:80 nginx | ||
| - | ``` | + | |
| Lister les ports : | Lister les ports : | ||
| - | ``` | + | |
| docker port moncontainer | docker port moncontainer | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1014: | Ligne 1014: | ||
| Le conteneur a son propre système : | Le conteneur a son propre système : | ||
| - | ``` | + | |
| docker exec -it moncontainer sh | docker exec -it moncontainer sh | ||
| ls -la | ls -la | ||
| - | ``` | + | |
| Pour copier un fichier : | Pour copier un fichier : | ||
| - | ``` | + | |
| docker cp fichier.txt moncontainer:/ | docker cp fichier.txt moncontainer:/ | ||
| docker cp moncontainer:/ | docker cp moncontainer:/ | ||
| - | ``` | + | |
| ---- | ---- | ||
| ===== 4.13 Nettoyage des conteneurs ===== | ===== 4.13 Nettoyage des conteneurs ===== | ||
| - | ``` | + | |
| docker rm id | docker rm id | ||
| docker rm -f id | docker rm -f id | ||
| docker container prune | docker container prune | ||
| docker system prune | docker system prune | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1041: | Ligne 1041: | ||
| * **container keeps restarting** | * **container keeps restarting** | ||
| → mauvais CMD / erreur au démarrage | → mauvais CMD / erreur au démarrage | ||
| - | | + | |
| docker logs | docker logs | ||
| - | | + | |
| * **ports already in use** | * **ports already in use** | ||
| Ligne 1059: | Ligne 1059: | ||
| ==== 1. Lancer un conteneur Nginx ==== | ==== 1. Lancer un conteneur Nginx ==== | ||
| - | ``` | + | |
| docker run -d -p 8080:80 --name demo-nginx nginx | docker run -d -p 8080:80 --name demo-nginx nginx | ||
| - | ``` | + | |
| ==== 2. Explorer le conteneur ==== | ==== 2. Explorer le conteneur ==== | ||
| - | ``` | + | |
| docker exec -it demo-nginx sh | docker exec -it demo-nginx sh | ||
| - | ``` | + | |
| ==== 3. Voir les logs ==== | ==== 3. Voir les logs ==== | ||
| - | ``` | + | |
| docker logs -f demo-nginx | docker logs -f demo-nginx | ||
| - | ``` | + | |
| ==== 4. Copier un fichier de configuration ==== | ==== 4. Copier un fichier de configuration ==== | ||
| - | ``` | + | |
| docker cp demo-nginx:/ | docker cp demo-nginx:/ | ||
| - | ``` | + | |
| ==== 5. Redémarrer ==== | ==== 5. Redémarrer ==== | ||
| - | ``` | + | |
| docker restart demo-nginx | docker restart demo-nginx | ||
| - | ``` | + | |
| ==== 6. Supprimer ==== | ==== 6. Supprimer ==== | ||
| - | ``` | + | |
| docker rm -f demo-nginx | docker rm -f demo-nginx | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1147: | Ligne 1147: | ||
| Création : | Création : | ||
| - | ``` | + | |
| docker volume create data-mysql | docker volume create data-mysql | ||
| - | ``` | + | |
| Utilisation : | Utilisation : | ||
| - | ``` | + | |
| docker run -d -v data-mysql:/ | docker run -d -v data-mysql:/ | ||
| - | ``` | + | |
| Lister : | Lister : | ||
| - | ``` | + | |
| docker volume ls | docker volume ls | ||
| - | ``` | + | |
| Inspecter : | Inspecter : | ||
| - | ``` | + | |
| docker volume inspect data-mysql | docker volume inspect data-mysql | ||
| - | ``` | + | |
| Avantages : | Avantages : | ||
| Ligne 1177: | Ligne 1177: | ||
| Syntaxe : | Syntaxe : | ||
| - | ``` | + | |
| -v / | -v / | ||
| - | ``` | + | |
| Exemple : | Exemple : | ||
| - | ``` | + | |
| docker run -d -v / | docker run -d -v / | ||
| - | ``` | + | |
| Avantages : | Avantages : | ||
| Ligne 1199: | Ligne 1199: | ||
| Sous Linux : | Sous Linux : | ||
| - | ``` | + | |
| / | / | ||
| - | ``` | + | |
| Sous macOS et Windows (Docker Desktop) : | Sous macOS et Windows (Docker Desktop) : | ||
| Ligne 1211: | Ligne 1211: | ||
| Depuis un conteneur temporaire : | Depuis un conteneur temporaire : | ||
| - | ``` | + | |
| docker run --rm -it -v data-mysql:/ | docker run --rm -it -v data-mysql:/ | ||
| - | ``` | + | |
| Puis dans le conteneur : | Puis dans le conteneur : | ||
| - | ``` | + | |
| ls -la /data | ls -la /data | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1228: | Ligne 1228: | ||
| Corriger une permission avec alpine : | Corriger une permission avec alpine : | ||
| - | ``` | + | |
| docker run --rm -v data:/data alpine chown -R 1000:1000 /data | docker run --rm -v data:/data alpine chown -R 1000:1000 /data | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1237: | Ligne 1237: | ||
| Création d’une archive : | Création d’une archive : | ||
| - | ``` | + | |
| docker run --rm -v data-mysql:/ | docker run --rm -v data-mysql:/ | ||
| - | ``` | + | |
| Restauration : | Restauration : | ||
| - | ``` | + | |
| docker run --rm -v data-mysql:/ | docker run --rm -v data-mysql:/ | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1251: | Ligne 1251: | ||
| Supprimer un volume spécifique : | Supprimer un volume spécifique : | ||
| - | ``` | + | |
| docker volume rm data-mysql | docker volume rm data-mysql | ||
| - | ``` | + | |
| Supprimer les volumes inutilisés : | Supprimer les volumes inutilisés : | ||
| - | ``` | + | |
| docker volume prune | docker volume prune | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1283: | Ligne 1283: | ||
| Commandes à exécuter : | Commandes à exécuter : | ||
| - | ``` | + | |
| docker volume create mysql-data | docker volume create mysql-data | ||
| docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=1234 | docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=1234 | ||
| - | ``` | + | |
| Ajouter une table : | Ajouter une table : | ||
| - | ``` | + | |
| docker exec -it mydb mysql -u root -p1234 -e " | docker exec -it mydb mysql -u root -p1234 -e " | ||
| docker exec -it mydb mysql -u root -p1234 -e "USE test; CREATE TABLE demo(id INT);" | docker exec -it mydb mysql -u root -p1234 -e "USE test; CREATE TABLE demo(id INT);" | ||
| - | ``` | + | |
| Supprimer le conteneur : | Supprimer le conteneur : | ||
| - | ``` | + | |
| docker rm -f mydb | docker rm -f mydb | ||
| - | ``` | + | |
| ==== CORRIGÉ ==== | ==== CORRIGÉ ==== | ||
| Vérification : | Vérification : | ||
| - | ``` | + | |
| docker run --rm -it -v mysql-data:/ | docker run --rm -it -v mysql-data:/ | ||
| - | ``` | + | |
| → **les fichiers .ibd et .frm sont présents** | → **les fichiers .ibd et .frm sont présents** | ||
| → la base est bien persistée | → la base est bien persistée | ||
| Ligne 1312: | Ligne 1312: | ||
| Création bind mount : | Création bind mount : | ||
| - | ``` | + | |
| mkdir ~/monapp | mkdir ~/monapp | ||
| echo " | echo " | ||
| docker run --rm -it -v ~/ | docker run --rm -it -v ~/ | ||
| - | ``` | + | |
| Dans alpine : | Dans alpine : | ||
| - | ``` | + | |
| cat / | cat / | ||
| - | ``` | + | |
| MODIFIER depuis le conteneur : | MODIFIER depuis le conteneur : | ||
| - | ``` | + | |
| echo " | echo " | ||
| - | ``` | + | |
| Quitter, puis vérifier côté hôte : | Quitter, puis vérifier côté hôte : | ||
| - | ``` | + | |
| cat ~/ | cat ~/ | ||
| - | ``` | + | |
| ==== CORRIGÉ ==== | ==== CORRIGÉ ==== | ||
| Ligne 1343: | Ligne 1343: | ||
| Créer un volume : | Créer un volume : | ||
| - | ``` | + | |
| docker volume create testdata | docker volume create testdata | ||
| - | ``` | + | |
| Ajouter des fichiers : | Ajouter des fichiers : | ||
| - | ``` | + | |
| docker run --rm -v testdata:/ | docker run --rm -v testdata:/ | ||
| - | ``` | + | |
| Sauver : | Sauver : | ||
| - | ``` | + | |
| mkdir ~/backup | mkdir ~/backup | ||
| docker run --rm -v testdata:/ | docker run --rm -v testdata:/ | ||
| - | ``` | + | |
| ==== CORRIGÉ ==== | ==== CORRIGÉ ==== | ||
| Fichier créé : | Fichier créé : | ||
| - | ``` | + | |
| ls -la ~/ | ls -la ~/ | ||
| - | ``` | + | |
| → archive présente | → archive présente | ||
| → backup réussi | → backup réussi | ||
| Ligne 1406: | Ligne 1406: | ||
| Schéma général : | Schéma général : | ||
| - | ``` | + | |
| [Host Network] | [Host Network] | ||
| │ | │ | ||
| Ligne 1412: | Ligne 1412: | ||
| │ | │ | ||
| [Bridge Network] — Conteneurs isolés + IP internes | [Bridge Network] — Conteneurs isolés + IP internes | ||
| - | ``` | + | |
| Chaque conteneur vit dans un **namespace réseau isolé**. | Chaque conteneur vit dans un **namespace réseau isolé**. | ||
| Ligne 1433: | Ligne 1433: | ||
| Le réseau *bridge* est créé automatiquement : | Le réseau *bridge* est créé automatiquement : | ||
| - | ``` | + | |
| docker network ls | docker network ls | ||
| - | ``` | + | |
| On y voit : | On y voit : | ||
| - | ``` | + | |
| bridge | bridge | ||
| - | ``` | + | |
| IP par défaut : | IP par défaut : | ||
| - | ``` | + | |
| 172.17.0.0/ | 172.17.0.0/ | ||
| - | ``` | + | |
| Lorsqu’un conteneur démarre : | Lorsqu’un conteneur démarre : | ||
| - | ``` | + | |
| docker run -d nginx | docker run -d nginx | ||
| - | ``` | + | |
| Il reçoit une IP locale : | Il reçoit une IP locale : | ||
| - | ``` | + | |
| 172.17.0.2 | 172.17.0.2 | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1462: | Ligne 1462: | ||
| Le mapping : | Le mapping : | ||
| - | ``` | + | |
| -p 8080:80 | -p 8080:80 | ||
| - | ``` | + | |
| Signifie : | Signifie : | ||
| - | ``` | + | |
| HÔTE port 8080 → CONTENEUR port 80 | HÔTE port 8080 → CONTENEUR port 80 | ||
| - | ``` | + | |
| Docker configure automatiquement : | Docker configure automatiquement : | ||
| Ligne 1481: | Ligne 1481: | ||
| ==== Inspecter un réseau ==== | ==== Inspecter un réseau ==== | ||
| - | ``` | + | |
| docker network inspect bridge | docker network inspect bridge | ||
| - | ``` | + | |
| ==== Inspecter un conteneur ==== | ==== Inspecter un conteneur ==== | ||
| - | ``` | + | |
| docker inspect moncontainer | docker inspect moncontainer | ||
| - | ``` | + | |
| Sections importantes : | Sections importantes : | ||
| Ligne 1501: | Ligne 1501: | ||
| Créer : | Créer : | ||
| - | ``` | + | |
| docker network create monreseau | docker network create monreseau | ||
| - | ``` | + | |
| Lancer deux conteneurs : | Lancer deux conteneurs : | ||
| - | ``` | + | |
| docker run -d --name web --network monreseau nginx | docker run -d --name web --network monreseau nginx | ||
| docker run -d --name api --network monreseau alpine sleep 9999 | docker run -d --name api --network monreseau alpine sleep 9999 | ||
| - | ``` | + | |
| Tester la communication : | Tester la communication : | ||
| - | ``` | + | |
| docker exec -it api ping web | docker exec -it api ping web | ||
| - | ``` | + | |
| Résultat attendu : | Résultat attendu : | ||
| - | ``` | + | |
| PING web (172.x.x.x): | PING web (172.x.x.x): | ||
| - | ``` | + | |
| Docker crée automatiquement un **DNS interne**. | Docker crée automatiquement un **DNS interne**. | ||
| Ligne 1528: | Ligne 1528: | ||
| Créer un alias : | Créer un alias : | ||
| - | ``` | + | |
| docker run -d --network monreseau --network-alias backend nginx | docker run -d --network monreseau --network-alias backend nginx | ||
| - | ``` | + | |
| Tester : | Tester : | ||
| - | ``` | + | |
| docker exec -it api ping backend | docker exec -it api ping backend | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1541: | Ligne 1541: | ||
| ===== 6.8 Le réseau Host ===== | ===== 6.8 Le réseau Host ===== | ||
| - | ``` | + | |
| docker run --network host nginx | docker run --network host nginx | ||
| - | ``` | + | |
| Le conteneur : | Le conteneur : | ||
| Ligne 1557: | Ligne 1557: | ||
| ===== 6.9 Le réseau None ===== | ===== 6.9 Le réseau None ===== | ||
| - | ``` | + | |
| docker run --network none alpine | docker run --network none alpine | ||
| - | ``` | + | |
| Résultat : | Résultat : | ||
| Ligne 1576: | Ligne 1576: | ||
| Exemple de création : | Exemple de création : | ||
| - | ``` | + | |
| docker network create -d macvlan | docker network create -d macvlan | ||
| - | ``` | + | |
| Les conteneurs apparaissent comme des machines réelles sur le LAN. | Les conteneurs apparaissent comme des machines réelles sur le LAN. | ||
| Ligne 1597: | Ligne 1597: | ||
| Exemple : | Exemple : | ||
| - | ``` | + | |
| version: " | version: " | ||
| services: | services: | ||
| Ligne 1614: | Ligne 1614: | ||
| backend: | backend: | ||
| driver: bridge | driver: bridge | ||
| - | ``` | + | |
| Test DNS : | Test DNS : | ||
| - | ``` | + | |
| docker compose exec api ping web | docker compose exec api ping web | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1626: | Ligne 1626: | ||
| ==== Tester DNS ==== | ==== Tester DNS ==== | ||
| - | ``` | + | |
| docker exec -it conteneur nslookup web | docker exec -it conteneur nslookup web | ||
| - | ``` | + | |
| ==== Sniffer ==== | ==== Sniffer ==== | ||
| - | ``` | + | |
| docker run --rm -it --net=host nicolaka/ | docker run --rm -it --net=host nicolaka/ | ||
| - | ``` | + | |
| Netshoot contient : | Netshoot contient : | ||
| Ligne 1649: | Ligne 1649: | ||
| Commandes : | Commandes : | ||
| - | ``` | + | |
| docker run -d --name test-nginx nginx | docker run -d --name test-nginx nginx | ||
| docker inspect -f '{{ .NetworkSettings.IPAddress }}' test-nginx | docker inspect -f '{{ .NetworkSettings.IPAddress }}' test-nginx | ||
| - | ``` | + | |
| **RÉPONSE ATTENDUE : | **RÉPONSE ATTENDUE : | ||
| Ligne 1662: | Ligne 1662: | ||
| Création réseau : | Création réseau : | ||
| - | ``` | + | |
| docker network create reseau-test | docker network create reseau-test | ||
| - | ``` | + | |
| Lancement conteneurs : | Lancement conteneurs : | ||
| - | ``` | + | |
| docker run -d --name c1 --network reseau-test alpine sleep 9999 | docker run -d --name c1 --network reseau-test alpine sleep 9999 | ||
| docker run -d --name c2 --network reseau-test alpine sleep 9999 | docker run -d --name c2 --network reseau-test alpine sleep 9999 | ||
| - | ``` | + | |
| Ping : | Ping : | ||
| - | ``` | + | |
| docker exec -it c1 ping -c 2 c2 | docker exec -it c1 ping -c 2 c2 | ||
| - | ``` | + | |
| **RÉPONSE ATTENDUE : | **RÉPONSE ATTENDUE : | ||
| Ligne 1684: | Ligne 1684: | ||
| ==== EXERCICE 3 : Conteneur sans réseau ==== | ==== EXERCICE 3 : Conteneur sans réseau ==== | ||
| - | ``` | + | |
| docker run --network none alpine ip a | docker run --network none alpine ip a | ||
| - | ``` | + | |
| **RÉPONSE ATTENDUE : | **RÉPONSE ATTENDUE : | ||
| Ligne 1732: | Ligne 1732: | ||
| Commande principale : | Commande principale : | ||
| - | ``` | + | |
| docker compose up -d | docker compose up -d | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1741: | Ligne 1741: | ||
| Structure générale : | Structure générale : | ||
| - | ``` | + | |
| version: " | version: " | ||
| services: | services: | ||
| Ligne 1753: | Ligne 1753: | ||
| volumes: | volumes: | ||
| ... | ... | ||
| - | ``` | + | |
| Les sections principales : | Les sections principales : | ||
| Ligne 1767: | Ligne 1767: | ||
| Exemple : | Exemple : | ||
| - | ``` | + | |
| services: | services: | ||
| web: | web: | ||
| Ligne 1773: | Ligne 1773: | ||
| ports: | ports: | ||
| - " | - " | ||
| - | ``` | + | |
| Options courantes : | Options courantes : | ||
| Ligne 1790: | Ligne 1790: | ||
| ===== 7.4 Build d’une image via Compose ===== | ===== 7.4 Build d’une image via Compose ===== | ||
| - | ``` | + | |
| services: | services: | ||
| api: | api: | ||
| Ligne 1796: | Ligne 1796: | ||
| ports: | ports: | ||
| - " | - " | ||
| - | ``` | + | |
| Compose exécutera automatiquement : | Compose exécutera automatiquement : | ||
| - | ``` | + | |
| docker build . | docker build . | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1808: | Ligne 1808: | ||
| ==== Dans le fichier ==== | ==== Dans le fichier ==== | ||
| - | ``` | + | |
| environment: | environment: | ||
| - APP_ENV=prod | - APP_ENV=prod | ||
| - DB_HOST=mysql | - DB_HOST=mysql | ||
| - | ``` | + | |
| ==== Via .env ==== | ==== Via .env ==== | ||
| Fichier `.env` : | Fichier `.env` : | ||
| - | ``` | + | |
| APP_ENV=prod | APP_ENV=prod | ||
| PORT=8080 | PORT=8080 | ||
| - | ``` | + | |
| Compose : | Compose : | ||
| - | ``` | + | |
| ports: | ports: | ||
| - " | - " | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1832: | Ligne 1832: | ||
| Exemple : | Exemple : | ||
| - | ``` | + | |
| services: | services: | ||
| db: | db: | ||
| Ligne 1841: | Ligne 1841: | ||
| volumes: | volumes: | ||
| dbdata: | dbdata: | ||
| - | ``` | + | |
| Permet la persistance automatique. | Permet la persistance automatique. | ||
| Ligne 1850: | Ligne 1850: | ||
| Définir un réseau : | Définir un réseau : | ||
| - | ``` | + | |
| networks: | networks: | ||
| backend: | backend: | ||
| driver: bridge | driver: bridge | ||
| - | ``` | + | |
| Assigner un service : | Assigner un service : | ||
| - | ``` | + | |
| services: | services: | ||
| api: | api: | ||
| Ligne 1863: | Ligne 1863: | ||
| networks: | networks: | ||
| - backend | - backend | ||
| - | ``` | + | |
| Par défaut, Compose crée un réseau : | Par défaut, Compose crée un réseau : | ||
| - | ``` | + | |
| < | < | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1874: | Ligne 1874: | ||
| ===== 7.8 depends_on (ordre de démarrage) ===== | ===== 7.8 depends_on (ordre de démarrage) ===== | ||
| - | ``` | + | |
| services: | services: | ||
| web: | web: | ||
| depends_on: | depends_on: | ||
| - db | - db | ||
| - | ``` | + | |
| IMPORTANT : | IMPORTANT : | ||
| Ligne 1885: | Ligne 1885: | ||
| Pour vérifier la santé : | Pour vérifier la santé : | ||
| - | ``` | + | |
| healthcheck: | healthcheck: | ||
| test: [" | test: [" | ||
| Ligne 1891: | Ligne 1891: | ||
| timeout: 3s | timeout: 3s | ||
| retries: 5 | retries: 5 | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1897: | Ligne 1897: | ||
| ===== 7.9 Commande, entrypoint ===== | ===== 7.9 Commande, entrypoint ===== | ||
| - | ``` | + | |
| services: | services: | ||
| app: | app: | ||
| image: node | image: node | ||
| command: [" | command: [" | ||
| - | ``` | + | |
| Override ENTRYPOINT : | Override ENTRYPOINT : | ||
| - | ``` | + | |
| entrypoint: [" | entrypoint: [" | ||
| command: [" | command: [" | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1914: | Ligne 1914: | ||
| ===== 7.10 Restart policies ===== | ===== 7.10 Restart policies ===== | ||
| - | ``` | + | |
| restart: always | restart: always | ||
| restart: on-failure | restart: on-failure | ||
| restart: unless-stopped | restart: unless-stopped | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1924: | Ligne 1924: | ||
| ===== 7.11 Scaling (réplication) ===== | ===== 7.11 Scaling (réplication) ===== | ||
| - | ``` | + | |
| docker compose up -d --scale web=3 | docker compose up -d --scale web=3 | ||
| - | ``` | + | |
| Limites : | Limites : | ||
| Ligne 1932: | Ligne 1932: | ||
| Exemple correct : | Exemple correct : | ||
| - | ``` | + | |
| ports: | ports: | ||
| - " | - " | ||
| - | ``` | + | |
| (= port dynamique) | (= port dynamique) | ||
| Ligne 1942: | Ligne 1942: | ||
| ===== 7.12 Commandes essentielles ===== | ===== 7.12 Commandes essentielles ===== | ||
| - | ``` | + | |
| docker compose up -d | docker compose up -d | ||
| docker compose down | docker compose down | ||
| Ligne 1950: | Ligne 1950: | ||
| docker compose restart | docker compose restart | ||
| docker compose up -d --build | docker compose up -d --build | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1956: | Ligne 1956: | ||
| ===== 7.13 Exemple complet : Nginx + PHP + MySQL ===== | ===== 7.13 Exemple complet : Nginx + PHP + MySQL ===== | ||
| - | ``` | + | |
| version: " | version: " | ||
| services: | services: | ||
| Ligne 1982: | Ligne 1982: | ||
| volumes: | volumes: | ||
| dbdata: | dbdata: | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 1988: | Ligne 1988: | ||
| ===== 7.14 Exemple professionnel : API Node + Redis cache ===== | ===== 7.14 Exemple professionnel : API Node + Redis cache ===== | ||
| - | ``` | + | |
| version: " | version: " | ||
| services: | services: | ||
| Ligne 2006: | Ligne 2006: | ||
| volumes: | volumes: | ||
| redisdata: | redisdata: | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2015: | Ligne 2015: | ||
| docker-compose.yml : | docker-compose.yml : | ||
| - | ``` | + | |
| version: " | version: " | ||
| services: | services: | ||
| Ligne 2022: | Ligne 2022: | ||
| ports: | ports: | ||
| - " | - " | ||
| - | ``` | + | |
| Commande : | Commande : | ||
| - | ``` | + | |
| docker compose up -d | docker compose up -d | ||
| - | ``` | + | |
| **RÉPONSE :** http:// | **RÉPONSE :** http:// | ||
| Ligne 2036: | Ligne 2036: | ||
| docker-compose.yml : | docker-compose.yml : | ||
| - | ``` | + | |
| services: | services: | ||
| c1: | c1: | ||
| Ligne 2045: | Ligne 2045: | ||
| image: alpine | image: alpine | ||
| command: sleep 9999 | command: sleep 9999 | ||
| - | ``` | + | |
| Test : | Test : | ||
| - | ``` | + | |
| docker compose exec c1 ping -c 2 c2 | docker compose exec c1 ping -c 2 c2 | ||
| - | ``` | + | |
| **RÉPONSE :** | **RÉPONSE :** | ||
| Ligne 2060: | Ligne 2060: | ||
| docker-compose.yml : | docker-compose.yml : | ||
| - | ``` | + | |
| version: " | version: " | ||
| services: | services: | ||
| Ligne 2072: | Ligne 2072: | ||
| volumes: | volumes: | ||
| mysqldata: | mysqldata: | ||
| - | ``` | + | |
| Test : | Test : | ||
| - | ``` | + | |
| docker compose exec db mysql -uroot -p1234 -e " | docker compose exec db mysql -uroot -p1234 -e " | ||
| docker compose down | docker compose down | ||
| docker compose up -d | docker compose up -d | ||
| docker compose exec db mysql -uroot -p1234 -e "SHOW DATABASES;" | docker compose exec db mysql -uroot -p1234 -e "SHOW DATABASES;" | ||
| - | ``` | + | |
| **RÉPONSE : | **RÉPONSE : | ||
| Ligne 2145: | Ligne 2145: | ||
| Exemple dans Dockerfile : | Exemple dans Dockerfile : | ||
| - | ``` | + | |
| RUN adduser -D appuser | RUN adduser -D appuser | ||
| USER appuser | USER appuser | ||
| - | ``` | + | |
| Pour vérifier : | Pour vérifier : | ||
| - | ``` | + | |
| docker exec -it monapp id | docker exec -it monapp id | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2162: | Ligne 2162: | ||
| Lister les capabilities disponibles : | Lister les capabilities disponibles : | ||
| - | ``` | + | |
| docker run --rm alpine capsh --print | docker run --rm alpine capsh --print | ||
| - | ``` | + | |
| Désactiver TOUTES les capabilities : | Désactiver TOUTES les capabilities : | ||
| - | ``` | + | |
| docker run --cap-drop=ALL myapp | docker run --cap-drop=ALL myapp | ||
| - | ``` | + | |
| N’en autoriser qu’une : | N’en autoriser qu’une : | ||
| - | ``` | + | |
| docker run --cap-drop=ALL --cap-add=NET_ADMIN myapp | docker run --cap-drop=ALL --cap-add=NET_ADMIN myapp | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2183: | Ligne 2183: | ||
| Voir le profil par défaut : | Voir le profil par défaut : | ||
| - | ``` | + | |
| / | / | ||
| - | ``` | + | |
| Exécuter un conteneur sans seccomp : | Exécuter un conteneur sans seccomp : | ||
| - | ``` | + | |
| docker run --security-opt seccomp=unconfined myapp | docker run --security-opt seccomp=unconfined myapp | ||
| - | ``` | + | |
| → DÉCONSEILLÉ en production. | → DÉCONSEILLÉ en production. | ||
| Ligne 2199: | Ligne 2199: | ||
| ==== AppArmor (Ubuntu / Debian) ==== | ==== AppArmor (Ubuntu / Debian) ==== | ||
| Voir profils : | Voir profils : | ||
| - | ``` | + | |
| aa-status | aa-status | ||
| - | ``` | + | |
| Activer un profil : | Activer un profil : | ||
| - | ``` | + | |
| docker run --security-opt apparmor=monprofil myapp | docker run --security-opt apparmor=monprofil myapp | ||
| - | ``` | + | |
| ==== SELinux (CentOS / RHEL) ==== | ==== SELinux (CentOS / RHEL) ==== | ||
| Mode permissif : | Mode permissif : | ||
| - | ``` | + | |
| setenforce 0 | setenforce 0 | ||
| - | ``` | + | |
| Mode enforcing : | Mode enforcing : | ||
| - | ``` | + | |
| setenforce 1 | setenforce 1 | ||
| - | ``` | + | |
| Label SELinux pour Docker : | Label SELinux pour Docker : | ||
| - | ``` | + | |
| docker run -v data:/ | docker run -v data:/ | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2229: | Ligne 2229: | ||
| Docker propose un scan natif : | Docker propose un scan natif : | ||
| - | ``` | + | |
| docker scan monimage | docker scan monimage | ||
| - | ``` | + | |
| Sortie : | Sortie : | ||
| Ligne 2240: | Ligne 2240: | ||
| Autre outil : Trivy | Autre outil : Trivy | ||
| - | ``` | + | |
| docker run aquasec/ | docker run aquasec/ | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2249: | Ligne 2249: | ||
| Activer la confiance : | Activer la confiance : | ||
| - | ``` | + | |
| export DOCKER_CONTENT_TRUST=1 | export DOCKER_CONTENT_TRUST=1 | ||
| - | ``` | + | |
| Signer une image : | Signer une image : | ||
| - | ``` | + | |
| docker trust sign monrepo/ | docker trust sign monrepo/ | ||
| - | ``` | + | |
| Valider une signature : | Valider une signature : | ||
| - | ``` | + | |
| docker trust inspect monrepo/ | docker trust inspect monrepo/ | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2274: | Ligne 2274: | ||
| * utiliser multi-stage builds | * utiliser multi-stage builds | ||
| * supprimer les outils sensibles : | * supprimer les outils sensibles : | ||
| - | | + | |
| RUN apk del curl git build-base | RUN apk del curl git build-base | ||
| - | | + | |
| ---- | ---- | ||
| Ligne 2283: | Ligne 2283: | ||
| ==== Isoler les processus ==== | ==== Isoler les processus ==== | ||
| - | ``` | + | |
| docker run --pids-limit 100 myapp | docker run --pids-limit 100 myapp | ||
| - | ``` | + | |
| ==== Limiter mémoire ==== | ==== Limiter mémoire ==== | ||
| - | ``` | + | |
| docker run --memory=512m myapp | docker run --memory=512m myapp | ||
| - | ``` | + | |
| ==== Limiter CPU ==== | ==== Limiter CPU ==== | ||
| - | ``` | + | |
| docker run --cpus=" | docker run --cpus=" | ||
| - | ``` | + | |
| ==== Lire-only filesystem ==== | ==== Lire-only filesystem ==== | ||
| - | ``` | + | |
| docker run --read-only myapp | docker run --read-only myapp | ||
| - | ``` | + | |
| ==== Désactiver nouveau processus ==== | ==== Désactiver nouveau processus ==== | ||
| - | ``` | + | |
| docker run --security-opt no-new-privileges myapp | docker run --security-opt no-new-privileges myapp | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2317: | Ligne 2317: | ||
| ---- Exemple : Nginx accessible seulement via backend ---- | ---- Exemple : Nginx accessible seulement via backend ---- | ||
| - | ``` | + | |
| networks: | networks: | ||
| backend: | backend: | ||
| Ligne 2329: | Ligne 2329: | ||
| networks: | networks: | ||
| - backend | - backend | ||
| - | ``` | + | |
| ---- Firewall interne ---- | ---- Firewall interne ---- | ||
| - | ``` | + | |
| docker run --cap-add NET_ADMIN alpine iptables -L | docker run --cap-add NET_ADMIN alpine iptables -L | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2346: | Ligne 2346: | ||
| ==== Docker Compose secrets ==== | ==== Docker Compose secrets ==== | ||
| - | ``` | + | |
| secrets: | secrets: | ||
| db_pass: | db_pass: | ||
| file: ./ | file: ./ | ||
| - | ``` | + | |
| ==== Usage ==== | ==== Usage ==== | ||
| - | ``` | + | |
| services: | services: | ||
| db: | db: | ||
| secrets: | secrets: | ||
| - db_pass | - db_pass | ||
| - | ``` | + | |
| Dans le conteneur : | Dans le conteneur : | ||
| - | ``` | + | |
| / | / | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2370: | Ligne 2370: | ||
| Authentification : | Authentification : | ||
| - | ``` | + | |
| docker login registry.example.com | docker login registry.example.com | ||
| - | ``` | + | |
| Limiter le push : | Limiter le push : | ||
| - | ``` | + | |
| docker push registry.example.com/ | docker push registry.example.com/ | ||
| - | ``` | + | |
| Registry privé sécurisé : | Registry privé sécurisé : | ||
| Ligne 2394: | Ligne 2394: | ||
| Solution : | Solution : | ||
| - | ``` | + | |
| docker run -it --user 1000:1000 alpine id | docker run -it --user 1000:1000 alpine id | ||
| - | ``` | + | |
| **RÉPONSE :** | **RÉPONSE :** | ||
| Le conteneur affiche : | Le conteneur affiche : | ||
| - | ``` | + | |
| uid=1000 gid=1000 | uid=1000 gid=1000 | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2409: | Ligne 2409: | ||
| Commandes : | Commandes : | ||
| - | ``` | + | |
| docker run --cap-drop=ALL alpine sh -c "ping 8.8.8.8" | docker run --cap-drop=ALL alpine sh -c "ping 8.8.8.8" | ||
| - | ``` | + | |
| **RÉSULTAT ATTENDU :** | **RÉSULTAT ATTENDU :** | ||
| - | ``` | + | |
| ping: socket: Operation not permitted | ping: socket: Operation not permitted | ||
| - | ``` | + | |
| → NORMAL : capability supprimée. | → NORMAL : capability supprimée. | ||
| Ligne 2423: | Ligne 2423: | ||
| ==== EXERCICE 3 : Scanner une image ==== | ==== EXERCICE 3 : Scanner une image ==== | ||
| - | ``` | + | |
| docker scan nginx | docker scan nginx | ||
| - | ``` | + | |
| **RÉSULTAT ATTENDU :** | **RÉSULTAT ATTENDU :** | ||
| Ligne 2434: | Ligne 2434: | ||
| ==== EXERCICE 4 : Fichier système en mode read-only ==== | ==== EXERCICE 4 : Fichier système en mode read-only ==== | ||
| - | ``` | + | |
| docker run --read-only -it alpine touch /test | docker run --read-only -it alpine touch /test | ||
| - | ``` | + | |
| **RÉPONSE ATTENDUE :** | **RÉPONSE ATTENDUE :** | ||
| - | ``` | + | |
| touch: /test: Read-only file system | touch: /test: Read-only file system | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2487: | Ligne 2487: | ||
| Installation : | Installation : | ||
| - | ``` | + | |
| docker volume create portainer_data | docker volume create portainer_data | ||
| docker run -d -p 9443: | docker run -d -p 9443: | ||
| - | ``` | + | |
| Accès : | Accès : | ||
| - | ``` | + | |
| https:// | https:// | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2508: | Ligne 2508: | ||
| Compose complet : | Compose complet : | ||
| - | ``` | + | |
| version: " | version: " | ||
| services: | services: | ||
| Ligne 2523: | Ligne 2523: | ||
| npm-data: | npm-data: | ||
| npm-letsencrypt: | npm-letsencrypt: | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2537: | Ligne 2537: | ||
| Exemple service avec labels : | Exemple service avec labels : | ||
| - | ``` | + | |
| services: | services: | ||
| api: | api: | ||
| Ligne 2544: | Ligne 2544: | ||
| - " | - " | ||
| - " | - " | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2550: | Ligne 2550: | ||
| ===== 9.4 Watchtower — Mise à jour automatique des conteneurs ===== | ===== 9.4 Watchtower — Mise à jour automatique des conteneurs ===== | ||
| - | ``` | + | |
| docker run -d | docker run -d | ||
| - | ``` | + | |
| Fonctions : | Fonctions : | ||
| Ligne 2563: | Ligne 2563: | ||
| ===== 9.5 Netshoot — Le couteau suisse du diagnostic réseau ===== | ===== 9.5 Netshoot — Le couteau suisse du diagnostic réseau ===== | ||
| - | ``` | + | |
| docker run --rm -it nicolaka/ | docker run --rm -it nicolaka/ | ||
| - | ``` | + | |
| Inclut : | Inclut : | ||
| Ligne 2577: | Ligne 2577: | ||
| Ex : résolution DNS interne → | Ex : résolution DNS interne → | ||
| - | ``` | + | |
| dig web | dig web | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2585: | Ligne 2585: | ||
| ===== 9.6 cAdvisor — Monitoring CPU / RAM / I/O ===== | ===== 9.6 cAdvisor — Monitoring CPU / RAM / I/O ===== | ||
| - | ``` | + | |
| docker run -d -p 8080: | docker run -d -p 8080: | ||
| - | ``` | + | |
| Interface : | Interface : | ||
| - | ``` | + | |
| http:// | http:// | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2608: | Ligne 2608: | ||
| ===== 9.8 Dive — Analyse de la taille d’image ===== | ===== 9.8 Dive — Analyse de la taille d’image ===== | ||
| - | ``` | + | |
| docker run --rm -it wagoodman/ | docker run --rm -it wagoodman/ | ||
| - | ``` | + | |
| Dive analyse : | Dive analyse : | ||
| Ligne 2623: | Ligne 2623: | ||
| Installation : | Installation : | ||
| - | ``` | + | |
| curl https:// | curl https:// | ||
| - | ``` | + | |
| Interface : | Interface : | ||
| - | ``` | + | |
| lazydocker | lazydocker | ||
| - | ``` | + | |
| Fonctions : | Fonctions : | ||
| Ligne 2643: | Ligne 2643: | ||
| ===== 9.10 Buildx — Build avancé multi-architecture ===== | ===== 9.10 Buildx — Build avancé multi-architecture ===== | ||
| - | ``` | + | |
| docker buildx create --use | docker buildx create --use | ||
| docker buildx build --platform linux/ | docker buildx build --platform linux/ | ||
| - | ``` | + | |
| Pratique pour : | Pratique pour : | ||
| Ligne 2657: | Ligne 2657: | ||
| ===== 9.11 Stern — Logs multi-conteneurs ===== | ===== 9.11 Stern — Logs multi-conteneurs ===== | ||
| - | ``` | + | |
| stern " | stern " | ||
| - | ``` | + | |
| Similaire à : | Similaire à : | ||
| - | ``` | + | |
| docker compose logs -f | docker compose logs -f | ||
| - | ``` | + | |
| Mais avec filtrage avancé. | Mais avec filtrage avancé. | ||
| Ligne 2674: | Ligne 2674: | ||
| Commandes : | Commandes : | ||
| - | ``` | + | |
| docker volume create portainer_data | docker volume create portainer_data | ||
| docker run -d -p 9443:9443 --name portainer | docker run -d -p 9443:9443 --name portainer | ||
| - | ``` | + | |
| **RÉPONSE : | **RÉPONSE : | ||
| Ligne 2687: | Ligne 2687: | ||
| Commandes : | Commandes : | ||
| - | ``` | + | |
| docker run -d --name web nginx | docker run -d --name web nginx | ||
| docker run -d --name api --network bridge alpine sleep 9999 | docker run -d --name api --network bridge alpine sleep 9999 | ||
| docker exec -it api apk add bind-tools | docker exec -it api apk add bind-tools | ||
| docker exec -it api dig web | docker exec -it api dig web | ||
| - | ``` | + | |
| **RÉSULTAT ATTENDU : | **RÉSULTAT ATTENDU : | ||
| Ligne 2702: | Ligne 2702: | ||
| Commande : | Commande : | ||
| - | ``` | + | |
| docker run --rm -it wagoodman/ | docker run --rm -it wagoodman/ | ||
| - | ``` | + | |
| **RÉSULTAT ATTENDU :** | **RÉSULTAT ATTENDU :** | ||
| Ligne 2716: | Ligne 2716: | ||
| Commande : | Commande : | ||
| - | ``` | + | |
| docker run -d --name watchtower | docker run -d --name watchtower | ||
| - | ``` | + | |
| **RÉPONSE ATTENDUE :** | **RÉPONSE ATTENDUE :** | ||
| Ligne 2788: | Ligne 2788: | ||
| Bonne pratique : | Bonne pratique : | ||
| - | ``` | + | |
| FROM node: | FROM node: | ||
| RUN adduser -D appuser | RUN adduser -D appuser | ||
| USER appuser | USER appuser | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2799: | Ligne 2799: | ||
| ==== Limiter CPU ==== | ==== Limiter CPU ==== | ||
| - | ``` | + | |
| docker run --cpus=" | docker run --cpus=" | ||
| - | ``` | + | |
| ==== Limiter RAM ==== | ==== Limiter RAM ==== | ||
| - | ``` | + | |
| docker run --memory=" | docker run --memory=" | ||
| - | ``` | + | |
| ==== Limiter PIDs ==== | ==== Limiter PIDs ==== | ||
| - | ``` | + | |
| docker run --pids-limit=100 myapp | docker run --pids-limit=100 myapp | ||
| - | ``` | + | |
| ==== Système de fichier read-only ==== | ==== Système de fichier read-only ==== | ||
| - | ``` | + | |
| docker run --read-only myapp | docker run --read-only myapp | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2831: | Ligne 2831: | ||
| Logging driver : | Logging driver : | ||
| - | ``` | + | |
| docker run --log-driver json-file myapp | docker run --log-driver json-file myapp | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2846: | Ligne 2846: | ||
| Exemple cAdvisor : | Exemple cAdvisor : | ||
| - | ``` | + | |
| docker run -d -p 8080:8080 gcr.io/ | docker run -d -p 8080:8080 gcr.io/ | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2861: | Ligne 2861: | ||
| Exemple labels : | Exemple labels : | ||
| - | ``` | + | |
| labels: | labels: | ||
| - " | - " | ||
| - " | - " | ||
| - " | - " | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2892: | Ligne 2892: | ||
| Backup modèle : | Backup modèle : | ||
| - | ``` | + | |
| docker run --rm -v data:/ | docker run --rm -v data:/ | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2901: | Ligne 2901: | ||
| Pipeline GitHub Actions : | Pipeline GitHub Actions : | ||
| - | ``` | + | |
| name: Deploy | name: Deploy | ||
| on: push | on: push | ||
| Ligne 2912: | Ligne 2912: | ||
| - run: docker login -u $USER -p $PASS | - run: docker login -u $USER -p $PASS | ||
| - run: docker push myapp | - run: docker push myapp | ||
| - | ``` | + | |
| Pipeline complet : | Pipeline complet : | ||
| Ligne 2925: | Ligne 2925: | ||
| ===== 10.10 Docker Swarm — haute disponibilité simple ===== | ===== 10.10 Docker Swarm — haute disponibilité simple ===== | ||
| - | ``` | + | |
| docker swarm init | docker swarm init | ||
| docker service create --replicas 3 nginx | docker service create --replicas 3 nginx | ||
| - | ``` | + | |
| Fonctions : | Fonctions : | ||
| Ligne 2965: | Ligne 2965: | ||
| Exemple : | Exemple : | ||
| - | ``` | + | |
| docker run --security-opt no-new-privileges | docker run --security-opt no-new-privileges | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 2979: | Ligne 2979: | ||
| Exemple Compose : | Exemple Compose : | ||
| - | ``` | + | |
| networks: | networks: | ||
| public: | public: | ||
| Ligne 2992: | Ligne 2992: | ||
| networks: | networks: | ||
| - internal | - internal | ||
| - | ``` | + | |
| ---- | ---- | ||
| Ligne 3000: | Ligne 3000: | ||
| ==== EXERCICE 1 : Limiter un conteneur ==== | ==== EXERCICE 1 : Limiter un conteneur ==== | ||
| Commande : | Commande : | ||
| - | ``` | + | |
| docker run --cpus=" | docker run --cpus=" | ||
| - | ``` | + | |
| **RÉPONSE :** | **RÉPONSE :** | ||
| Le conteneur ne peut utiliser que : | Le conteneur ne peut utiliser que : | ||
| Ligne 3011: | Ligne 3011: | ||
| ==== EXERCICE 2 : Scanner une image ==== | ==== EXERCICE 2 : Scanner une image ==== | ||
| - | ``` | + | |
| docker scan nginx | docker scan nginx | ||
| - | ``` | + | |
| **RÉPONSE :** | **RÉPONSE :** | ||
| La liste des CVE s’affiche → corrigées avant mise en prod. | La liste des CVE s’affiche → corrigées avant mise en prod. | ||
| Ligne 3020: | Ligne 3020: | ||
| ==== EXERCICE 3 : Tester read-only ==== | ==== EXERCICE 3 : Tester read-only ==== | ||
| - | ``` | + | |
| docker run --read-only -it alpine touch /test | docker run --read-only -it alpine touch /test | ||
| - | ``` | + | |
| **RÉSULTAT ATTENDU :** | **RÉSULTAT ATTENDU :** | ||
| - | ``` | + | |
| touch: /test: Read-only file system | touch: /test: Read-only file system | ||
| - | ``` | + | |
| ---- | ---- | ||
informatique/docker.txt · Dernière modification : de john
