Quelques notes sur l’utilisation de docker.
Je ne vais pas détailler ici ce qu’est docker ni à quoi ça peut servir, il y a suffisamment d’articles sur le net. Pour faire simple, docker est un système de gestion de conteneurs.
Dockerfile
Un Dockerfile est un fichier d’instructions permettant de créer une image. Il doit toujours s’appeler Dockerfile.
# fenrir/test
# Debian latest
# Test image
#
# VERSION 0.0.1
#
FROM debian:latest
MAINTAINER Fenrir <mon.addresse@de.messagerie>
ENV DEBIAN_FRONTEND noninteractive
# Install ssh
RUN apt-get update && apt-get install -y -q ssh
# Configure ssh
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN rm /etc/ssh/ssh_host_*_key.pub
# Start ssh server
CMD ["/usr/sbin/sshd", "-D"]
# Expose port
EXPOSE 22
Image
Les images sont les briques de bases de docker, on peut voir une image comme un instantané d’un système avec sa configuration et ses applications. C’est à partir de ces images que sont créés les conteneurs, mais une image peut aussi servir de base pour une autre image (comme dans le Dockerfile ci-dessus).
Conteneur
C’est principalement ça qu’on manipule, un conteneur est une branche exécutable d’une image. Les bonnes pratiquent veulent qu’un conteneur soit jetable à tout moment sans perte de données, dit autrement, un conteneur ne devrait rien contenir d’autre que ses programmes. Tout ce qui est données (par exemple les pages d’un site web et le contenu de sa base de données) devraient être en dehors du conteneur, par exemple dans des volumes.
Volume
On vient de dire qu’un conteneur doit être jetable, il faut donc enregistrer les données dans un endroit persistant, on peut le faire de plusieurs manières, les plus courantes sont :
- un conteneur dédié : c’est un conteneur qui n’aura comme but que d’accueillir les données d’autres conteneurs, évidement ce conteneur ne sera pas à jeter
- un dossier (ou un fichier) de l’hôte : il sera monté dans le conteneur
- un « data volume » : c’est un dossier particulier, créé au démarrage du conteneur mais qui est conservé à la destruction du conteneur
- un mixte de tout ou partie des 3 : par exemple un conteneur dédié dans lequel on a mappé un dossier de l’hôte
Une bonne pratique consiste à utiliser un conteneur dédié, car ça offre quelques facilités
- partage des données entre conteneurs
- déplacement des conteneurs et de leurs données vers un autre serveur
- …
Commande
Il existe de nombreuses interfaces pour manipuler les conteneurs, mais il est préférable de commencer par utiliser les commandes car dans la plupart des cas c’est :
- plus rapide
- plus fiable
- plus simple
- plus reproductible
- plus facile à expliquer
Ci dessous les commandes courantes, pour la liste complète : Docker CLI
Les valeurs entre <> sont à adapter (sans les chevrons)
nb : la plupart des commandes disposent d’options, vous pouvez les obtenir avec :
docker <commande> --help
Image
docker images
docker search <terme à rechercher>
docker pull <nom de l'image>
docker rmi <nom ou ID de l'image>
docker build -t <nom de l'image> </chemin/vers/le/dockerfile/.>
docker commit <nom ou ID du conteneur> <nom de l'image>
Conteneur
docker ps
docker create --name <nom ou ID du conteneur> <nom de l'image>
docker run --name <nom ou ID du conteneur> <nom de l'image>
-p <port de l'hôte:port du conteneur>
-v <dossier de l'hôte:dossier dans le conteneur>
docker attach <nom ou ID du conteneur>
docker exec <nom ou ID du conteneur> <commande à exécuter>
docker inspect <nom ou ID du conteneur>
docker kill <nom ou ID du conteneur>
docker rename <nom ou ID du conteneur> <nom de l'image>
docker start <nom ou ID du conteneur>
docker stop <nom ou ID du conteneur>
docker restart <nom ou ID du conteneur>
docker top <nom ou ID du conteneur>
docker diff <nom ou ID du conteneur>
docker rm <nom ou ID du conteneur>
Exemple de commandes
docker run -i -t --name mon-conteneur -d debian:latest /bin/bash
docker exec mon-conteneur ls /etc
docker attach mon-conteneur