Dans un environnement conteneurisé standard, l'utilisation d'un hôte unique limite rapidement les capacités de montée en charge et de haute disponibilité. Pour gérer efficacement un parc de plusieurs serveurs Docker, il est nécessaire d'automatiser l'installation et la configuration du démon Docker sur chaque instance. Docker Machine répond à ce besoin en agissant comme un outil d'approvisionnement capable de déployer des moteurs Docker sur des machines virtuelles locales, des serveurs physiques ou des instances de cloud public via des pilotes (drivers) spécifiques.
Installlation de l'utilitaire Docker Machine
Avant de provisionner des hôtes distants, nous devons installer le binaire Docker Machine sur notre poste d'administration. Voici la procédure pour un environnement Linux :
# Téléchargement du binaire officiel
export MACHINE_VERSION=v0.16.0
curl -L https://github.com/docker/machine/releases/download/$MACHINE_VERSION/docker-machine-$(uname -s)-$(uname -m) > /tmp/docker-machine
# Installation dans le répertoire des exécutables
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
# Vérification de l'installation
docker-machine --version
Pour faciliter l'utilisation en ligne de commande, l'activation de l'autocomplétion Bash est fortement recommandée. Cela permet de naviguer plus rapidement entre les différentes commandes et les noms des hôtes gérés.
# Récupération des scripts de complétion
SCRIPTS_URL="https://raw.githubusercontent.com/docker/machine/v0.16.0/contrib/completion/bash"
for script in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
do
sudo wget "$SCRIPTS_URL/${script}" -P /etc/bash_completion.d
done
# Activation du prompt dynamique pour visualiser l'hôte actif
echo 'PS1="[\u@\h \W$(__docker_machine_ps1)]\$ "' >> ~/.bashrc
source ~/.bashrc
Préparation et création des hôtes Docker
Une "Machine" dans ce contexte désigne tout système d'exploitation exécutant le moteur Docker. Pour provisionner un serveur Linux existant, nous utilisons généralement le pilote generic. La condition préalable est de disposer d'un accès SSH sans mot de passe vers la cible.
# Injection de la clé SSH sur le serveur distant (ex: 192.168.1.50)
ssh-copy-id user@192.168.1.50
Une fois l'accès sécurisé établi, nous pouvons lancer la création du premier nœud, que nous nommerons node-alpha :
docker-machine create \
--driver generic \
--generic-ip-address=192.168.1.50 \
--generic-ssh-user=root \
node-alpha
Cette commande automatise plusieurs étapes : la génération de certificats TLS pour sécuriser l'API Docker, l'installation du moteur Docker sur la cible et le démarrage du service. Vous pouvez répéter l'opération pour un second nœud (node-beta) sur une autre IP (ex: 192.168.1.60).
Pilotage à distance et gestion du contexte
L'un des avantages majeurs de Docker Machine est la possibilité de piloter plusieurs serveurs distants depuis un termnial unique sans jamais avoir à ouvrir une session SSH maunelle. Pour lister les machines gérées et leur état, utilisez :
docker-machine ls
Pour diriger vos commandes Docker (comme docker run ou docker ps) vers une machine spécifique, il faut configurer les variables d'environnement de votre shell actuel. La commande env génère les exports nécessaires :
# Visualiser les variables pour node-alpha
docker-machine env node-alpha
# Appliquer la configuration au shell
eval $(docker-machine env node-alpha)
Une fois le contexte basculé sur node-alpha, toute commande Docker s'exécutera physiquement sur ce serveur. Par exemple, pour déployer un serveur Web :
# Cette commande s'exécute sur node-alpha
docker run -d -p 80:80 --name web-server nginx
Enfin, pour transférer des fichiers entre votre machine locale et un hôte géré, ou même entre deux hôtes, Docker Machine propose une commande de transfert sécurisé simplifiée :
# Copie d'un fichier de configuration vers node-alpha
docker-machine scp ./nginx.conf node-alpha:/etc/nginx/nginx.conf