Comment provisionner et gérer des hôtes Docker distants avec Docker Machine sur Ubuntu 18.04

introduction

Docker Machine est un outil qui facilite l'approvisionnement et la gestion de plusieurs hôtes Docker à distance à partir de votre ordinateur personnel. De tels serveurs sont généralement appelés hôtes dockerisés et sont utilisés pour exécuter des conteneurs Docker.

Bien que Docker Machine puisse être installé sur un système local ou distant, l'approche la plus courante consiste à l'installer sur votre ordinateur local (installation native ou machine virtuelle) et à l'utiliser pour configurer des serveurs distants dockérisés.

Bien que Docker Machine puisse être installé sur la plupart des distributions Linux, ainsi que sur MacOS et Windows, vous allez l'installer sur votre machine locale exécutant Ubuntu 18.04 dans ce tutoriel et l'utiliser pour configurer des droplets DigitalOcean dockerisés. Si vous n’avez pas d’ordinateur local Ubuntu 18.04, suivez ces instructions sur n’importe quel serveur Ubuntu 18.04.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin des éléments suivants:

  • Une machine locale ou un serveur exécutant Ubuntu 18.04 avec Docker installé. VoirHow To Install and Use Docker on Ubuntu 18.04 pour les instructions.

  • Un jeton d'API DigitalOcean. Si vous n'en avez pas, générez-le en utilisantthis guide. Lorsque vous générez un jeton, assurez-vous qu'il a une portée en lecture-écriture. C'est la valeur par défaut. Par conséquent, si vous ne modifiez aucune option lors de sa génération, il disposera de fonctionnalités en lecture-écriture.

[[step-1 -—- Installing-docker-machine]] == Étape 1 - Installation de Docker Machine

Pour utiliser Docker Machine, vous devez d'abord l'installer localement. Sous Ubuntu, cela signifie télécharger quelques scripts à partir du référentiel officiel de Docker sur GitHub.

Pour télécharger et installer le fichier binaire Docker Machine, tapez:

wget https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-$(uname -s)-$(uname -m)

Le nom du fichier doit êtredocker-machine-Linux-x86_64. Renommez-le endocker-machine pour faciliter le travail avec:

mv docker-machine-Linux-x86_64 docker-machine

Rendez-le exécutable:

chmod +x docker-machine

Déplacez-le ou copiez-le dans le répertoire/usr/local/bin afin qu'il soit disponible en tant que commande système:

sudo mv docker-machine /usr/local/bin

Vérifiez la version, qui indiquera qu’elle est correctement installée:

docker-machine version

Vous verrez une sortie similaire à celle-ci, affichant le numéro de version et la construction:

Outputdocker-machine version 0.15.0, build b48dc28d

Docker Machine est installé. Nous allons installer des outils d’aide supplémentaires pour rendre Docker Machine plus facile à utiliser.

[[step-2 -—- Installing-additional-docker-machine-scripts]] == Étape 2 - Installation de scripts supplémentaires pour Docker Machine

Il existe trois scripts Bash dans le référentiel GitHub de Docker Machine que vous pouvez installer pour faciliter l'utilisation des commandesdocker etdocker-machine. Une fois installés, ces scripts fournissent l'achèvement de la commande et la personnalisation des invites.

Dans cette étape, vous allez installer ces trois scripts dans le répertoire/etc/bash_completion.d sur votre machine locale en les téléchargeant directement à partir du référentiel GitHub Docker Machine.

[.note] #Note: Avant de télécharger et d'installer un script à partir d'Internet dans un emplacement à l'échelle du système, vous devez d'abord inspecter le contenu du script en affichant l'URL source dans votre navigateur.
#

Le premier script vous permet de voir la machine active dans votre invite. Cela s'avère pratique lorsque vous travaillez avec plusieurs machines dockérisées et que vous passez de l'une à l'autre. Le script s'appelledocker-machine-prompt.bash. Télécharge le

sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-prompt.bash -O /etc/bash_completion.d/docker-machine-prompt.bash

Pour terminer l'installation de ce fichier, vous devrez modifier la valeur de la variablePS1 dans votre fichier.bashrc. La variablePS1 est une variable shell spéciale utilisée pour modifier l'invite de commande Bash. Ouvrez~/.bashrc dans votre éditeur:

nano ~/.bashrc

Dans ce fichier, il y a trois lignes qui commencent parPS1. Ils devraient ressembler à ceux-ci:

~/.bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

...

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

...

PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

Pour chaque ligne, insérez$(__docker_machine_ps1 " [%s]") près de la fin, comme illustré dans l'exemple suivant:

~/.bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__docker_machine_ps1 " [%s]")\$ '

...

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ '

...

PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$(__docker_machine_ps1 " [%s]")$PS1"

Enregistrez et fermez le fichier.

Le deuxième script s'appelledocker-machine-wrapper.bash. Il ajoute une sous-commandeuse à la commandedocker-machine, ce qui facilite considérablement le basculement entre les hôtes Docker. Pour le télécharger, tapez:

sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-wrapper.bash -O /etc/bash_completion.d/docker-machine-wrapper.bash

Le troisième script s'appelledocker-machine.bash. Il ajoute l'achèvement bash pour les commandesdocker-machine. Téléchargez-le en utilisant:

sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash -O /etc/bash_completion.d/docker-machine.bash

Pour appliquer les modifications que vous avez apportées jusqu’à présent, fermez, puis rouvrez votre terminal. Si vous êtes connecté à la machine via SSH, quittez la session et reconnectez-vous, et la commande sera terminée pour les commandesdocker etdocker-machine.

Essayons de nouvelles choses en créant un nouvel hôte Docker avec Docker Machine.

[[step-3 -—- provisioning-a-dockerized-host-using-docker-machine]] == Étape 3 - Provisionnement d'un hôte dockerisé à l'aide de Docker Machine

Maintenant que Docker et Docker Machine sont en cours d’exécution sur votre machine locale, vous pouvez provisionner un Droplet Dockerized sur votre compte DigitalOcean à l’aide de la commandedocker-machine create de Docker Machine. Si vous ne l’avez pas déjà fait, affectez votre jeton d’API DigitalOcean à une variable d’environnement:

export DOTOKEN=your-api-token

NOTE: This tutorial uses [.highlight]#DOTOKEN comme variable bash pour le jeton DO API. Il n'est pas nécessaire que le nom de la variable soit DOTOKEN, et il ne doit pas nécessairement être en majuscules.
#

Pour rendre la variable permanente, placez-la dans votre fichier~/.bashrc. Cette étape est facultative, mais elle est nécessaire si vous souhaitez que la valeur persiste d’une session à l’autre.

Ouvrez ce fichier avecnano:

nano ~/.bashrc

Ajoutez cette ligne au fichier:

~/.bashrc

export DOTOKEN=your-api-token

Pour activer la variable dans la session de terminal en cours, tapez:

source ~/.bashrc

Pour appeler la commandedocker-machine create avec succès, vous devez spécifier lesdriver que vous souhaitez utiliser, ainsi qu'un nom de machine. Le pilote est l’adaptateur de l’infrastructure que vous allez créer. Il existe des pilotes pour les fournisseurs d'infrastructure cloud, ainsi que pour différentes plates-formes de virtualisation.

Nous utiliserons le pilotedigitalocean. En fonction du pilote que vous sélectionnez, vous devrez fournir des options supplémentaires pour créer une machine. Le pilotedigitalocean requiert le jeton API (ou la variable qui l'évalue) comme argument, ainsi que le nom de la machine que vous souhaitez créer.

Pour créer votre première machine, tapez cette commande pour créer un droplet DigitalOcean appelédocker-01:

docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN docker-01

Vous verrez cette sortie lorsque Docker Machine crée le droplet:

Output ...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env ubuntu1804-docker

Docker Machine crée une paire de clés SSH pour le nouvel hôte afin qu’il puisse accéder au serveur à distance. Droplet est configuré avec un système d'exploitation et Docker est installé. Lorsque la commande est terminée, votre droplet Docker est opérationnel.

Pour voir la machine nouvellement créée à partir de la ligne de commande, tapez:

docker-machine ls

La sortie sera semblable à celle-ci, indiquant que le nouvel hôte Docker est en cours d'exécution:

OutputNAME        ACTIVE   DRIVER         STATE     URL                         SWARM   DOCKER        ERRORS
docker-01   -        digitalocean   Running   tcp://209.97.155.178:2376           v18.06.1-ce

Voyons maintenant comment spécifier le système d’exploitation lorsque nous créons une machine.

[[step-4 -—- specifying-the-base-os-and-droplet-options-when-creating-a-dockerized-host]] == Étape 4 - Spécification du système d'exploitation de base et des options de droplet lors de la création d'un hôte ancré

Par défaut, le système d'exploitation de base utilisé lors de la création d'un hôte dockerisé avec Docker Machine estsupposed pour être le dernier Ubuntu LTS. Cependant, au moment de cette publication, la commandedocker-machine create utilise toujours Ubuntu 16.04 LTS comme système d'exploitation de base, même si Ubuntu 18.04 est la dernière édition LTS. Donc, si vous devez exécuter Ubuntu 18.04 sur une machine récemment provisionnée, vous devrez spécifier Ubuntu avec la version souhaitée en passant l'indicateur--digitalocean-image à la commandedocker-machine create.

Par exemple, pour créer une machine utilisant Ubuntu 18.04, tapez:

docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN docker-ubuntu-1804

Vous n'êtes pas limité à une version d'Ubuntu. Vous pouvez créer une machine à l'aide de tout système d'exploitation pris en charge par DigitalOcean. Par exemple, pour créer une machine utilisant Debian 8, tapez:

docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN docker-debian

Pour provisionner un hôte dockerisé en utilisant CentOS 7 comme système d'exploitation de base, spécifiezcentos-7-0-x86 comme nom d'image, comme ceci:

docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN docker-centos7

Le système d'exploitation de base n'est pas le seul choix que vous avez. Vous pouvez également spécifier la taille de la gouttelette. Par défaut, il s'agit du plus petit Droplet, doté de 1 Go de RAM, d'un seul processeur et d'un disque SSD de 25 Go.

Trouvez la taille du droplet que vous souhaitez utiliser en recherchant le slug correspondant dans lesDigitalOcean API documentation.

Par exemple, pour provisionner une machine avec 2 Go de RAM, deux processeurs et un SSD de 60 Go, utilisez le slugs-2vcpu-2gb:

docker-machine create --driver digitalocean --digitalocean-size s-2vcpu-2gb --digitalocean-access-token $DOTOKEN docker-03

Pour voir tous les indicateurs spécifiques à la création d'une machine Docker à l'aide du pilote DigitalOcean, tapez:

docker-machine create --driver digitalocean -h

[.tip] #Tip: Si vous actualisez la page Droplet de votre tableau de bord DigitalOcean, vous verrez les nouvelles machines que vous avez créées à l'aide de la commandedocker-machine.
#

Explorons maintenant certaines des autres commandes de Docker Machine.

[[step-5 -—- executing-additional-docker-machine-commands]] == Étape 5 - Exécution de commandes supplémentaires de Docker Machine

Vous avez vu comment provisionner un hôte dockerisé à l'aide de la sous-commandecreate et comment répertorier les hôtes disponibles pour Docker Machine à l'aide de la sous-commandels. Dans cette étape, vous apprendrez quelques sous-commandes plus utiles.

Pour obtenir des informations détaillées sur un hôte ancré, utilisez la sous-commandeinspect, comme ceci:

docker-machine inspect docker-01

La sortie comprend des lignes comme celles de la sortie suivante. La ligneImage indique la version de la distribution Linux utilisée et la ligneSize indique le slug de taille:

Output...
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "203.0.113.71",
        "MachineName": "docker-01",
        "SSHUser": "root",
        "SSHPort": 22,
        ...
        "Image": "ubuntu-16-04-x64",
        "Size": "s-1vcpu-1gb",
        ...
    },

---

Pour imprimer la configuration de connexion pour un hôte, tapez:

docker-machine config docker-01

Le résultat sera similaire à ceci:

Output--tlsverify
--tlscacert="/home/kamit/.docker/machine/certs/ca.pem"
--tlscert="/home/kamit/.docker/machine/certs/cert.pem"
--tlskey="/home/kamit/.docker/machine/certs/key.pem"
-H=tcp://203.0.113.71:2376

La dernière ligne de la sortie de la commandedocker-machine config révèle l'adresse IP de l'hôte, mais vous pouvez également obtenir cette information en tapant:

docker-machine ip docker-01

Si vous devez mettre hors tension un hôte distant, vous pouvez utiliserdocker-machine pour l'arrêter:

docker-machine stop docker-01

Vérifiez qu'il est arrêté:

docker-machine ls

La sortie indique que l'état de la machine a changé:

OuputNAME        ACTIVE   DRIVER         STATE     URL   SWARM   DOCKER    ERRORS
docker-01   -        digitalocean   Stopped                 Unknown

Pour le redémarrer, utilisez la sous-commandestart:

docker-machine start docker-01

Puis examinez à nouveau son statut:

docker-machine ls

Vous verrez que leSTATE est maintenant définiRunning pour l'hôte:

OuputNAME                ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS

docker-01           -        digitalocean   Running   tcp://203.0.113.71:2376            v18.06.1-ce

Voyons ensuite comment interagir avec l’hôte distant à l’aide de SSH.

[[step-6 -—- executing-commands-on-a-dockerized-host-via-ssh]] == Étape 6 - Exécution de commandes sur un hôte ancré via SSH

À ce stade, vous obtenez des informations sur vos machines, mais vous pouvez faire plus que cela. Par exemple, vous pouvez exécuter des commandes Linux natives sur un hôte Docker en utilisant la sous-commandessh dedocker-machine depuis votre système local. Cette section explique comment exécuter les commandesssh viadocker-machine ainsi que comment ouvrir une session SSH sur un hôte ancré.

En supposant que vous ayez configuré une machine avec Ubuntu comme système d'exploitation, exécutez la commande suivante sur votre système local pour mettre à jour la base de données de packages sur l'hôte Docker:

docker-machine ssh docker-01 apt-get update

Vous pouvez même appliquer les mises à jour disponibles en utilisant:

docker-machine ssh docker-01 apt-get upgrade

Vous ne savez pas quel noyau votre hôte Docker distant utilise? Tapez ce qui suit:

docker-machine ssh docker-01 uname -r

Enfin, vous pouvez vous connecter à l'hôte distant avec la commandedocker machine ssh:

docker-machine ssh docker-01

Vous serez connecté en tant qu'utilisateurroot et vous verrez quelque chose de similaire à ce qui suit:

Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-131-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

14 packages can be updated.
10 updates are security updates.

Déconnectez-vous en tapantexit pour revenir à votre machine locale.

Ensuite, nous dirigerons les commandes de Docker vers notre hôte distant.

[[step-7 -—- activating-a-dockerized-host]] == Étape 7 - Activation d'un hôte dockerized

L'activation d'un hôte Docker connecte votre client Docker local à ce système, ce qui permet d'exécuter des commandesdocker normales sur le système distant.

Tout d'abord, utilisez Docker Machine pour créer un nouvel hôte Docker appelédocker-ubuntu à l'aide d'Ubuntu 18.04:

docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN docker-ubuntu

Pour activer un hôte Docker, tapez la commande suivante:

eval $(docker-machine env machine-name)

Alternativement, vous pouvez l'activer en utilisant cette commande:

docker-machine use machine-name

[.tip] #Tip Lorsque vous travaillez avec plusieurs hôtes Docker, la commandedocker-machine use est la méthode la plus simple pour passer de l'un à l'autre.
#

Après avoir tapé l’une de ces commandes, votre invite changera pour indiquer que votre client Docker pointe vers l’hôte Docker distant. Cela prendra cette forme. Le nom de l'hôte sera à la fin de l'invite:

username@localmachine:~ [docker-01]$

Désormais, toute commandedocker que vous tapez à cette invite de commande sera exécutée sur cet hôte distant.

Exécutez à nouveaudocker-machine ls:

docker-machine ls

Vous verrez un astérisque sous la colonneACTIVE pourdocker-01:

OutputNAME                ACTIVE   DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
docker-01           *        digitalocean   Running   tcp://203.0.113.71:2376             v18.06.1-ce

Pour quitter l'hôte Docker distant, tapez ce qui suit:

docker-machine use -u

Votre invite ne montrera plus l'hôte actif.

Créons maintenant des conteneurs sur la machine distante.

[[step-8 -—- creation-docker-containers-on-a-remote-dockerized-host]] == Étape 8 - Création de conteneurs Docker sur un hôte distant ancré

Jusqu'à présent, vous avez provisionné une Droplet Dockerized sur votre compte DigitalOcean et vous l'avez activé - c'est-à-dire que votre client Docker le pointe. La prochaine étape logique consiste à faire tourner les conteneurs dessus. Par exemple, essayons d’exécuter le conteneur officiel Nginx.

Utilisezdocker-machine use pour sélectionner votre machine distante:

docker-machine use docker-01

Maintenant, exécutez cette commande pour exécuter un conteneur Nginx sur cette machine:

docker run -d -p 8080:80 --name httpserver nginx

Dans cette commande, nous mappons le port80 du conteneur Nginx sur le port8080 sur l'hôte ancré afin que nous puissions accéder à la page Nginx par défaut de n'importe où.

Une fois le conteneur construit, vous pourrez accéder à la page Nginx par défaut en pointant votre navigateur Web vershttp://docker_machine_ip:8080.

Tant que l'hôte Docker est toujours activé (comme l'indique son nom dans l'invite), vous pouvez répertorier les images de cet hôte:

docker images

La sortie inclut l'image Nginx que vous venez d'utiliser:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              71c43202b8ac        3 hours ago         109MB

Vous pouvez également répertorier les conteneurs actifs ou en cours d'exécution sur l'hôte:

docker ps

Si le conteneur Nginx que vous avez exécuté à cette étape est le seul conteneur actif, la sortie ressemblera à ceci:

OutputCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS
 PORTS                  NAMES
d3064c237372        nginx               "nginx -g 'daemon of…"   About a minute ago   Up About a minute
 0.0.0.0:8080->80/tcp   httpserver

Si vous avez l'intention de créer des conteneurs sur une machine distante, votre client Docker doit pointer vers celle-ci, c'est-à-dire que ce doit être la machine active dans le terminal que vous utilisez. Sinon, vous créerez le conteneur sur votre ordinateur local. Encore une fois, laissez votre invite de commande être votre guide.

Docker Machine peut créer et gérer des hôtes distants, mais également les supprimer.

[[step-9 -–- remove-docker-hosts]] == Étape 9 - Suppression d'hôtes Docker

Vous pouvez utiliser Docker Machine pour supprimer un hôte Docker que vous avez créé. Utilisez la commandedocker-machine rm pour supprimer l'hôtedocker-01 que vous avez créé:

docker-machine rm docker-01

Le droplet est supprimé avec la clé SSH créée à cet effet. Répertoriez les hôtes à nouveau:

docker-machine ls

Cette fois, vous ne verrez pas l'hôtedocker-01 répertorié dans la sortie. Et si vous n'avez créé qu'un seul hôte, vous ne verrez aucune sortie.

Assurez-vous d'exécuter la commandedocker-machine use -u pour renvoyer votre démon Docker local vers votre machine locale.

[[step-10 -—- disabling-crash-reporting-optional]] == Étape 10 - Désactivation de Crash Reporting (facultatif)

Par défaut, chaque fois qu'une tentative de provisionnement d'un hôte Dockerisé à l'aide de Docker Machine échoue ou que Docker Machine se bloque, certaines informations de diagnostic sont envoyées à un compte Docker leBugsnag. Si cela ne vous convient pas, vous pouvez désactiver la création de rapports en créant un fichier vide appeléno-error-report dans le répertoire.docker/machine de votre ordinateur local.

Pour créer le fichier, tapez:

touch ~/.docker/machine/no-error-report

Recherchez des messages d'erreur dans le fichier en cas d'échec de la mise en service ou d'échec de Docker Machine.

Conclusion

Vous avez installé et utilisé Docker Machine pour provisionner plusieurs hôtes Docker sur DigitalOcean à distance à partir de votre système local. À partir de là, vous devriez pouvoir provisionner autant d’hôtes dockérisés que nécessaire sur votre compte DigitalOcean.

Pour en savoir plus sur Docker Machine, visitez le siteofficial documentation page. Les trois scripts Bash téléchargés dans ce didacticiel sont hébergés surthis GitHub page.