Docker pratiques

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Recueil de commandes et pratiques d'exploitation Docker
Thèmes Nettoyage · variables d'environnement · export/import d'images · audit sécurité · réseau
Voir aussi Docker daemon.json · Docker socket · Docker users · Systemd

Cette page rassemble des commandes et réglages d'exploitation courants qui ne justifient pas chacun une page dédiée : nettoyage des ressources inutilisées, gestion des variables d'environnement, export/import d'images, audit de sécurité de l'hôte et du démon, et exposition ponctuelle de l'API sur le réseau.

Nettoyage courant

# Suppression forcée d'un conteneur (même en cours d'exécution)
docker rm -f <conteneur>

# Suppression de tous les conteneurs, actifs ou non
docker rm -f $(docker ps -aq)

# Suppression d'une image
docker rmi <image>

# Nettoyage global des ressources inutilisées (conteneurs arrêtés,
# réseaux orphelins, images sans tag, cache de build)
docker system prune

docker system prune ne touche pas aux volumes par défaut ; ajouter --volumes si un nettoyage plus agressif est souhaité (attention aux données qui ne seraient pas sauvegardées ailleurs).

Variables d'environnement

# Variable unique en ligne de commande
docker run -tid --name c1 --env PASSWORD=changeme ubuntu:latest

# Fichier d'environnement (une variable par ligne, KEY=VALUE)
docker run -tid --name c1 --env-file myfile_env.txt ubuntu:latest

Passer un secret en clair via --env ou --env-file l'expose dans docker inspect et dans les journaux d'audit du démon : pour un usage en production, préférer un mécanisme de secrets dédié (Docker secrets en mode swarm, Vault — voir Vault —, ou l'intégration secrets de l'orchestrateur utilisé).

Options diverses au lancement

docker run -tid --name c1 --hostname monhostpersonnalise ubuntu:latest

Export et import d'images

# Sauvegarder une image en fichier tar
docker save -o dir/nom-image.tar <registre>/<image>:<version>

# Restaurer une image depuis un fichier tar
docker load -i fichier.tar

Utile pour transférer une image vers un environnement sans accès direct à un registre (réseau isolé, air-gap).

Audit de sécurité de l'hôte Docker

Le projet docker-bench-security exécute une série de vérifications inspirées du CIS Benchmark Docker (configuration du démon, permissions de fichiers, isolation des conteneurs, etc.) :

docker run -it --net host --pid host --userns host --cap-add audit_control \
  -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
  -v /var/lib:/var/lib \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/lib/systemd:/usr/lib/systemd \
  -v /etc:/etc --label docker_bench_security \
  docker/docker-bench-security

Le conteneur reçoit volontairement des accès très larges à l'hôte (namespaces réseau/PID/utilisateur, socket Docker, arborescences systemd et /etc) : c'est nécessaire pour qu'il puisse inspecter la configuration réelle du système, mais cela en fait un outil à réserver à un lancement ponctuel et contrôlé, pas à un service permanent. Voir Docker trust pour le détail de DOCKER_CONTENT_TRUST.

Exposer temporairement l'API sur le réseau (sans TLS)

Pour un test local rapide, il est possible d'ajouter un listener TCP en plus du socket UNIX, via un fichier drop-in systemd :

sudo vim /etc/systemd/system/docker.service.d/startup_options.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
sudo systemctl daemon-reload
sudo systemctl restart docker

# Test
docker -H tcp://127.0.0.1:2375 ps

Le port 2375 ainsi ouvert n'est ni chiffré ni authentifié : équivalent à un accès root sans mot de passe pour quiconque peut l'atteindre. À réserver strictement à une boucle locale ou un réseau isolé — pour un accès distant, voir la procédure TLS complète dans Docker socket.

Modifier la plage IP du pont par défaut

Référence : https://docs.docker.com/v17.09/engine/userguide/networking/default_network/custom-docker0/

vi /etc/docker/daemon.json
{
  "bip": "172.20.0.1/24"
}
systemctl daemon-reload
service docker restart

En cas de besoin, l'interface docker0 peut être supprimée manuellement (elle sera recréée par Docker au redémarrage suivant) :

ip link del docker0

Voir aussi Docker daemon.json pour l'ensemble des clés de configuration du démon.