Skip to content

Docker

Docker

Tip

L'écosystème Docker - Docker Hub : Le registre officiel pour trouver des images. - Hadolint : Un linter pour Dockerfiles qui vous aide à suivre les bonnes pratiques. - Composerize : Convertissez vos commandes docker run en docker-compose.yml.

Commande de base

Lister des dockers :

sudo docker container ls -a

supprime le cache

sudo docker system prune -a

Activer le redémarrage automatique d'un conteneur

sudo docker update --restart unless-stopped container_id

Exécuter des commande dans un conteneur

sudo docker exec -i -t NOMDUCONTENEUR /bin/bash

Docker-compose dans un dossier différent :

sudo docker-compose -f /tmp/myproject/docker-compose.yml up -d 

Stoper tout les contneurs en même temps

docker stop $(docker ps -aq)

Lancer un conteneur alpine avec le shell

docker run -it --rm alpine /bin/sh

Docker sans être admin

Il faut le rajouter dans le groupe docker (rien de plus simple)

sudo usermod -aG docker user
newgrp docker #Pour rechercher les groupe sans se déconnecter

GPU Nvidia

Installation du driver Nvidia sur une distribution Debian:

sudo apt update
sudo apt install nvidia-driver nvidia-smi nvidia-kernel-dkms

Installation du driver Nvidia sur une distribution Redhat:

sudo dnf update
sudo dnf install -y nvidia-driver nvidia-smi

La commande installera le driver, le module noyau, le runtime et l'outil de gestion.

Avec Nvidia container toolkit

Installer Nvidia container toolkit :

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo nvidia-ctk runtime configure --runtime=docker

Note

Bien utiliser la commande nvidia-ctk pour enrigistrer le runtime nvidia

En Gpu passtrought

Ajouter ça dans le docker compose :

        deploy:
            resources:
                reservations:
                    devices:
                    - driver: nvidia
                      capabilities: ["gpu"]
                      count: 1

Exemple de conteneur

Watchtower : Permet d'automatiquement mettre à jour les conteneurs :

sudo docker run -d \
    --name watchtower \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --restart unless-stopped \
    containrrr/watchtower

Mise a jour Automatiques de contneurs

#!/bin/bash

# Variables
SEARCH_DIR="/home"

start_update_images() {
    docker run --rm \
        --name watchtower \
        -v /var/run/docker.sock:/var/run/docker.sock \
        containrrr/watchtower \
        --run-once \
        --monitor-only
}

start_all_docker_compose() {
    echo "Recherche des fichiers docker-compose dans $SEARCH_DIR..."

    # Trouver tous les fichiers au format compose de manière récursive, en ignorant les erreurs de permission
    find "$SEARCH_DIR" -type f \( -name "docker-compose.yml" -o -name "docker-compose.yaml" -o -name "compose.yaml" -o -name "compose.yml" \) 2>/dev/null | while read -r compose_file; do
        compose_dir=$(dirname "$compose_file")
        echo "Lancement de docker-compose up -d dans : $compose_dir"
        # Se déplacer dans le répertoire et exécuter docker-compose up -d
        (cd "$compose_dir" && docker-compose up -d)
    done
}

# Exécution des fonctions
start_update_images
start_all_docker_compose

Note

Cette méthode permet de mettre à jour globalement les conteneurs de manière cohérente. L'utilisation de --monitor-only avec Watchtower permet de détecter les nouvelles images sans modifier l'état des conteneurs. Si Watchtower effectuait la mise à jour lui-même, une exécution ultérieure de docker-compose up -d déclencherait une recréation des conteneurs car l'état local de Compose ne correspondrait plus à l'image déployée. En procédant ainsi, on s'assure que Docker Compose reste l'unique gestionnaire du cycle de vie des conteneurs.

Forcer la mise à jour de dépendances compilées (Bypass Cache)

Lorsqu'on compile ou installe un package externe directement depuis une source en ligne (ex: via go install, curl, pip, etc.) avec un tag générique comme @latest, Docker a tendance à mettre en cache l'étape de build et à ne plus la rejouer, même si une nouvelle version a été publiée.

Pour forcer Docker à invalider le cache et à recompiler uniquement lorsqu'une nouvelle version est disponible (sans utiliser --no-cache sur tout le build), on peut utiliser l'instruction ADD avec l'API des releases du projet (par exemple sur GitHub) juste avant l'étape d'installation :

# Se connecte à l'API GitHub pour récupérer les métadonnées de la dernière version.
# Si une nouvelle version est publiée, le JSON change, ce qui invalide le cache Docker pour cette étape et les suivantes.
ADD https://api.github.com/repos/PlakarKorp/plakar/releases/latest /tmp/latest_release.json

# Cette étape sera rejouée uniquement si le cache a été invalidé ci-dessus
RUN go install github.com/PlakarKorp/plakar@latest

Cette méthode permet de garder l'image à jour automatiquement sans avoir à modifier manuellement le Dockerfile.

Lien utile

Composerize permet de transformer les commandes docker run par docker-compose.

Source : Composerize

Executer sans êtres sudoers

Pour ajouter les permissions :

sudo usermod -aG docker $USER