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

introduction

Docker Machine est un outil qui facilite la mise en service 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 peuvent naturellement être 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 Mac OS X et Windows, dans ce tutoriel, nous l'installerons sur votre machine locale exécutant Ubuntu 16.04 et nous l'utilisons pour fournir des droplets DigitalOcean dockerisés.

Conditions préalables

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

  • Une machine locale exécutant Ubuntu 16.04 avec Docker installé (voirHow To Install and Use Docker on Ubuntu 16.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, elle disposera de fonctionnalités de lecture-écriture. Pour faciliter son utilisation sur la ligne de commande, veillez à affecter le jeton à une variable comme indiqué dans cet article.

[[step-1 -—- Installing-docker-machine-on-your-local-computer]] == Étape 1 - Installation de Docker Machine sur votre ordinateur local

Dans cette étape, nous allons suivre le processus d’installation de Docker Machine sur votre ordinateur local exécutant Ubuntu 16.04.

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

wget https://github.com/docker/machine/releases/download/v0.14.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épertoireusr/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

La sortie doit être similaire à

Outputdocker-machine version 0.14.0, build 89b8332

[[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 conçus pour faciliter l'utilisation des commandesdocker etdocker-machine. Ils fournissent l'achèvement de la commande et la personnalisation de l'invite bash.

Dans cette étape, nous allons installer ces trois scripts sur votre ordinateur local. Ils seront téléchargés et installés dans le répertoire/etc/bash_completion.d.

Le premier script vous permet de voir la machine active à partir de votre invite bash. 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. Pour le télécharger, tapez:

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 du fichier ci-dessus, vous devrez définir une valeur personnalisée pour la variablePS1 dans votre fichier.bashrc. Pour ce faire, ouvrez-le en utilisantnano (PS1 est une variable shell spéciale utilisée pour modifier l'invite de commande bash):

nano ~/.bashrc

Dans ce fichier, il y a trois lignes qui commencent parPS1. Ils devraient être comme 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 pour qu'ils lisent:

~/.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 le basculement entre les machines 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 connectez-vous à nouveau. L'achèvement de la commande pour les commandesdocker etdocker-machine devrait maintenant fonctionner.

[[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 désormais 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 bash à l'aide de:

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 dans les sessions de terminal.

Ouvrez ce fichier avecnano:

nano ~/.bashrc

Ajoutez une ligne semblable à celle-ci n'importe où:

~/.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 (au minimum) le pilote, le jeton API (ou la variable qui l'évalue) et un nom unique pour la machine. Pour créer votre première machine, tapez:

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

La sortie partielle lors de la création de la machine est la suivante. Dans cette sortie, le nom de la machine estubuntu1604-docker:

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 ubuntu1604-docker

Une paire de clés SSH est créée pour le nouvel hôte afin quedocker-machine puisse y accéder à distance. Droplet est configuré avec le système d'exploitation souhaité et Docker est installé sur le système. 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

Le résultat devrait ressembler à ceci:

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

[[step-4 -—- specifying-the-base-os-when-creating-a-dockerized-host]] == Étape 4 - Spécification du système d'exploitation de base 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 machine-name

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 machine-name

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 centos7-docker

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 machine-name

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.
#

[[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 ancré à l’aide de la sous-commandecreate. Vous avez également vu comment répertorier les hôtes disponibles pour Docker Machine à l'aide de la sous-commandels. Dans cette étape, vous apprendrez quelques sous-commandes dedocker-machineupplémentaires.

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

docker-machine inspect machine-name

La sortie devrait inclure des lignes comme celles-ci. 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": "ubuntu1604-docker",
        "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 machine-name

Le résultat devrait ressembler à 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 machine-name

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

docker-machine stop machine-name

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

docker-machine ls

Le statut de la machine a changé:

OuputNAME                 ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS
ubuntu1604-docker                  digitalocean   Timeout

Pour le redémarrer:

docker-machine start machine-name

Vérifiez qu'il est démarré:

docker-machine ls

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

OuputNAME                 ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS

ubuntu1604-docker         -        digitalocean   Running   tcp://203.0.113.71:2376           v18.05.0-ce

Ensuite, vous pouvez le supprimer en utilisant:

docker-machine rm machine-name

Le Droplet est supprimé avec la clé SSH créée pour lui pardocker-machine. Maintenant, lorsque vous répertoriez les hôtes ancrés, vous ne devriez pas voir celui que vous venez de supprimer:

docker-machine ls

[[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 machine-name apt-get update

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

docker-machine ssh machine-name apt-get upgrade

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

docker-machine ssh machine-name uname -r

En plus d'utiliser la sous-commandessh pour exécuter des commandes sur l'hôte Docker distant, vous pouvez également l'utiliser pour vous connecter à la machine elle-même. C’est aussi simple que de taper:

docker-machine ssh machine-name

Votre invite de commande changera pour refléter le fait que vous êtes connecté à l'hôte distant:

Outputroot@machine-name#

Pour quitter l'hôte distant, tapez:

exit

[[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. 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 des commandes ci-dessus, votre invite bash devrait changer 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:~ [machine-name]$

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

Si un hôte est actif sur le terminal sur lequel la commandedocker-machine ls est exécutée, l'astérisque sous la colonneACTIVE indique qu'il est actif.

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

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

docker-machine use -u

Vous serez renvoyé à l'invite de votre système local.

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 machine-name

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ù.

Si la commande s'exécute avec succès, 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 son nom l'indique dans l'invite), vous devriez pouvoir répertorier les images de cet hôte:

docker images

La sortie doit inclure l'image Nginx que vous venez d'utiliser, ainsi que d'autres téléchargées auparavant:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              ae513a47849c        3 weeks 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 devrait ressembler à ceci:

OutputCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4284f9d25548        nginx               "nginx -g 'daemon of…"   20 minutes ago      Up 20 minutes       0.0.0.0:8080->80/tcp   httpserver

Pour quitter l'invite de l'hôte distant, tapez. Cela fermera également le terminal:

exit

[.note] #Note: Si vous avez l’intention de créer des conteneurs sur une machine distante, votre client Docker doit pointer vers celui-ci, c’est-à-dire qu’il doit être l’ordinateur actif du 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.
#

[[step-9 -—- disabling-crash-reporting-optional]] == Étape 9 - 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 se bloque, certaines informations de diagnostic sont automatiquement envoyées à un compte Docker sur Bugsnag. 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 de votre installation.docker/machine.

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

C’est une introduction à l’installation et à l’utilisation de Docker Machine pour mettre en service plusieurs droplets Docker à distance à partir d’un système local. Maintenant, vous devriez pouvoir provisionner rapidement autant d’hôtes dockérisés que nécessaire sur votre compte DigitalOcean.

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