# [Docker] Cheat-sheet

## Introduction

Cette page répertorie des commandes docker pour administrer vos conteneurs.

## Commandes de base

#### Démarrer un conteneur

```bash
docker run -d -p <HOST:CT> --name <CT_NAME> <IMG>
```

#### Arrêter un conteneur

```bash
docker stop <CT_NAME>
```

#### Supprimer un conteneur

```bash
docker rm <CT_NAME>
```

<p class="callout warning">Le conteneur doit être arrêté pour le supprimer.</p>

#### Redémarrer un conteneur

```bash
docker restart <CT_NAME>
```

## Images

#### Télécharger une image Docker

```bash
docker pull <IMG>
```


#### Lister les images présente sur le système

```bash
docker images 
```

#### Supprimer une image docker

```bash
docker rmi <IMG>
```

#### Supprimer les images inutilisées

```bash
docker images -f dangling=true
```

## Réseaux

#### Création de réseau Docker

Pour créer un réseau simple sur Docker, il faut exécuter la commande suivante :

```bash
docker network create --driver <DRVR_TYPE> <NET_NAME>
```

<table border="1" id="bkmrk-types-de-drivers-des" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50.0618%;"></col><col style="width: 24.9691%;"></col><col style="width: 24.9691%;"></col></colgroup><tbody><tr><td class="align-center">**Types de drivers**</td><td class="align-center">**Description**</td><td class="align-center">**Commande**</td></tr><tr><td class="align-center">**bridge** (default)</td><td class="align-center">Créer un réseau Naté et isolé pour les conteneurs.</td><td class="align-center">docker network create --driver bridge &lt;NET\_NAME&gt;</td></tr><tr><td class="align-center">**host**</td><td class="align-center">Utilise directement le réseau de l'hôte</td><td class="align-center">docker run --network host --name &lt;CT\_NAME&gt; &lt;IMG&gt;</td></tr><tr><td class="align-center">**overlay**</td><td class="align-center">Permet aux conteneurs qui ne sont pas sur le même hôte d'appartenir à un même réseau (très utilisé avec Docker Swarm).</td><td class="align-center">docker network create --driver overlay &lt;NET\_NAME&gt;</td></tr><tr><td class="align-center">**macvlan**</td><td class="align-center">Donne une adresse MAC aux conteneur ce qui les fait apparaître comme de véritables appareils du réseau de l'hôte.</td><td class="align-center">docker network create -d macvlan --subnet=&lt;NET\_ID/MASK&gt; --gateway=&lt;IP&gt; -o parent=&lt;IFACE&gt; &lt;NET\_NAME&gt;</td></tr></tbody></table>

#### Lister les réseaux existants

```bash
docker network ls
```

#### Afficher le détail d'un réseau

```bash
docker network inspect <NET_NAME>
```

#### Supprimer un réseau

```bash
docker network rm <NET_NAME>
```

#### Connecter un conteneur à un réseau

```bash
docker network connect <NET_NAME> <CT_NAME>
```

#### Déconnecter un conteneur d'un réseau

```bash
docker network disconnect <NET_NAME> <CT_NAME>
```

#### Créer un réseau isolé

```bash
docker network create --driver bridge --subnet <NET_ID/MASK> isolated_network
```

## Volumes

#### Créer un volume

```bash
docker volume create <VOL_NAME>
```

#### Attacher un volume à un conteneur

```bash
docker run -d -v <VOL_NAME>:/data --name <CT_NAME> <IMG>
```

<p class="callout info">Les volumes docker sont stockés dans **/var/lib/docker/volumes** .</p>

#### Faire du bind mount

Ce type de montage spécifie l'emplacement du volume sur le système hôte :

```bash
docker run -d -v /root/my_app/data:/data --name <CT_NAME> <IMG>
```

#### Lister les volumes

```bash
docker volume ls
```

#### Afficher les détails d'un volume

```bash
docker volume inspect <VOL_NAME>
```

#### Créer un volume en lecture seule

```bash
docker run -d -v /root/my_app/data:/data:ro --name <CT_NAME> <IMG>
```

#### Supprimer un volume

```bash
docker volume rm <VOL_NAME>
```

#### Nettoyer les volumes non utilisés

```bash
docker volume prune
```

#### Copier un fichier de l'hôte sur un volume

```bash
docker cp /path/to/file.txt <CT_NAME>:/data/file.txt
```


#### Faire une sauvegarde d'un volume

```bash
docker run --rm --volumes-from <CT_NAME> -v $(pwd):/backup ubuntu tar cvzf /backup/backup.tar.gz /data
```

## Dockerfile

Le **Dockerfile** est un fichier permettant de créer une image docker pour votre application :

```
# Utilise l'image Python comme base
FROM python:3.8

# Définit l'espace de travail
WORKDIR /app

# Copie les fichiers de l'application dans l'espace de travail
COPY . /app

# Installe les dépendances
RUN pip install -r requirements.txt

# Expose le port 5000 du conteneur
EXPOSE 5000

# Lance le script au démarrage de l'application.
CMD ["python", "app.py"]
```

#### Build une image à partir d'un Dockerfile

```bash
docker build -t <APP_NAME:latest> .
```

## Sécurité

#### Lancer un conteneur avec les droits d'un utilisateur non-root

```bash
docker run -u <UID>
```

#### Créer un secret

```bash
echo "<SECRET>" | docker secret create <SECRET_NAME> -
```

#### Ajouter un health check sur un conteneur

Cette option permet d'éteindre un conteneur automatique si celui-ci est en panne (pour éviter les problèmes de sécurité et les comportements inattendus) :

```bash
docker run --name <CT_NAME> --health-cmd="curl --fail http://localhost:80/health || exit 1" -d <CT_IMG>
```

## Débogage

#### Ouvrir un shell dans un conteneur

```bash
docker exec -it <CT_NAME> /bin/bash
```


#### Vérifier l'état du service

```bash
systemctl status docker
```

#### Vérifier le fonctionnement de docker

```bash
docker run hello-world
```

#### Afficher les conteneurs actifs

```bash
docker ps
```

<p class="callout info">Vous pouvez ajouter l'option **-a** pour afficher tous les conteneurs.</p>

#### Afficher les logs d'un conteneur

```bash
docker logs <CT_NAME>
```

#### Afficher la configuration d'un conteneur

```bash
docker inspect <CT_NAME>
```



#### Afficher les statistiques des conteneurs

```bash
docker stats
```

#### Écouter les événements docker

```bash
docker events
```

#### Afficher les changements dans le système de fichier d'un conteneur

```bash
docker diff <CT_NAME>
```

## Mettre à niveau un conteneur

#### Arrêt du conteneur

```bash
docker container stop <CONTAINER_NAME>
```

#### Recherche du nom de l'ancienne image

```bash
docker ps -f name=<CONTAINER_NAME> --format "{{.Image}}"
```

#### Suppression du conteneur

```bash
docker container rm <CONTAINER_NAME>
```

#### Suppression de l'ancienne image

```bash
docker rmi <CONTAINER_NAME>:<CONTAINER_OLD_VERSION>
```

#### Redéploiement du conteneur

```bash
docker run -d --name <CONTAINER_NAME> <IMG_REPOS/IMG>:<NEW_VERSION>
```