Bonus : Piloter des conteneurs Docker depuis PowerShell

Sophie ferme l’ordinateur portable qui lui a servi tout au long de cette formation : « Une dernière chose avant qu’on se quitte. Nordika a aussi une stack Docker, comme tu as pu le voir dans une autre formation du site. Bonne nouvelle : tout ce que tu as appris ici s’applique directement pour la piloter. »

Docker CLI reste Docker CLI, même depuis PowerShell

Aucune magie particulière ici : les commandes docker s’exécutent en PowerShell exactement comme dans n’importe quel autre terminal, car PowerShell reste avant tout un shell capable de lancer n’importe quel exécutable externe :

docker ps
docker images
docker compose up -d

Ce qui change, en revanche, c’est ce qu’on peut faire ensuite avec le résultat — et c’est là que les réflexes construits depuis la section 2 changent vraiment la donne.

Transformer une sortie texte Docker en objets PowerShell

Par défaut, docker ps renvoie du texte brut, pas des objets — Docker CLI ne connaît rien de la logique d’objets vue en 1.2. Mais Docker propose un format de sortie JSON, qu’on peut alors convertir avec ConvertFrom-Json (vu en 9.1) pour retrouver tous les réflexes de cette formation :

$conteneurs = docker ps --format "{{json .}}" | ConvertFrom-Json

$conteneurs | 
    Where-Object { $_.Status -like "*unhealthy*" } | 
    Select-Object -Property Names, Status, Image

D’un coup, docker ps devient filtrable, triable, exportable — exactement comme Get-Process ou Get-Service depuis le début de cette formation.

Un exemple concret Nordika : surveiller les conteneurs, comme les services Windows

En reprenant directement l’esprit de la fonction Test-ServiceCritique écrite en section 5 :

function Test-ConteneurCritique {
    param ([string]$NomConteneur)

    $conteneur = docker ps --filter "name=$NomConteneur" --format "{{json .}}" | ConvertFrom-Json

    if (-not $conteneur) {
        Write-Warning "$NomConteneur n'est pas démarré"
    } elseif ($conteneur.Status -like "*unhealthy*") {
        Write-Warning "$NomConteneur est démarré mais en mauvaise santé"
    } else {
        Write-Output "$NomConteneur : OK"
    }
}

Test-ConteneurCritique -NomConteneur "nordika-mariadb"

Cette fonction pourrait rejoindre le module NordikaTools construit en section 6, être planifiée comme le rapport de supervision en section 8, ou même être exposée via une route Pode comme en section 9 — toute la formation converge naturellement vers ce même genre de brique.

Automatiser un docker compose up avec gestion d’erreurs

Push-Location "C:\Nordika\Stacks\wordpress"

try {
    docker compose up -d
    if ($LASTEXITCODE -ne 0) {
        throw "docker compose a échoué avec le code $LASTEXITCODE"
    }
    Write-Output "Stack démarrée avec succès"
} catch {
    Write-Warning "Échec du démarrage de la stack : $($_.Exception.Message)"
} finally {
    Pop-Location
}

$LASTEXITCODE (rencontré ici pour la première fois) contient le code de sortie du dernier exécutable externe lancé — indispensable pour savoir si une commande comme docker compose, qui n’est pas une cmdlet PowerShell native, a réellement réussi ou échoué, puisque PowerShell ne peut pas deviner automatiquement le succès d’un programme externe comme il le ferait pour une erreur PowerShell native (section 5).

Retour d’expérience terrain : vérifier $LASTEXITCODE après tout appel à un outil en ligne de commande externe (Docker, mais aussi git, kubectl, ou n’importe quel binaire tiers) est un réflexe trop souvent oublié par les administrateurs habitués aux cmdlets natives, qui lèvent leurs propres erreurs PowerShell automatiquement. Sans cette vérification, un docker compose up en échec silencieux peut donner l’illusion trompeuse que tout s’est bien passé.

Ce bonus referme la boucle avec la formation Docker de ce même site : les deux mondes ne s’opposent pas, ils se complètent. Docker gère l’isolation et le déploiement des applications, PowerShell orchestre, surveille et automatise tout l’écosystème autour — services Windows, Active Directory, API, et maintenant conteneurs, avec un seul et même langage.

Dans la dernière leçon de cette formation, un retour sur tout ce que vous avez appris depuis le début.