GNU/Linux >> Tutoriels Linux >  >> Linux

Comment créer une machine virtuelle distante à l'aide du pilote SSH générique docker-machine

À l'aide de docker, vous pouvez regrouper votre application d'entreprise dans un conteneur autonome, qui est garanti pour s'exécuter sur n'importe quel environnement.

Cela permet aux développeurs et aux administrateurs système de gérer facilement l'application. Si vous êtes administrateur, vous n'avez plus besoin d'entendre cette excuse du développeur :"Mais, ça marche sur mon environnement de développement !"

Avec Docker Machine, vous pouvez installer et configurer Docker Engine sur un serveur distant. Une fois docker installé, depuis votre machine locale (ordinateur portable), vous pouvez gérer à distance le docker.

Dans ce tutoriel, nous parlerons spécifiquement du pilote générique utilisé par docker-machine, qui utilisera le client SSH pour gérer l'hôte docker distant.

1. Créer un utilisateur dockeradmin sur l'hôte distant

Tout d'abord, créez un compte utilisateur Linux sur le serveur distant. Vous n'avez pas vraiment besoin d'utiliser "dockeradmin" comme nom d'utilisateur, cela peut être n'importe quoi. Vous pouvez même utiliser votre propre nom d'utilisateur.

adduser dockeradmin

passwd dockeradmin

2. Générer une paire de clés publique-privée SSH sur l'hôte local

Ensuite, sur votre hôte local (ordinateur portable), créez une clé SSH publique et privée à l'aide de ssh-keygen. Vous devez également copier la clé privée sur le serveur distant.

Nous avons expliqué comment procéder dans cet article :Effectuer une connexion SSH à distance sans mot de passe

Mais, en bref, voici ce que vous devez faire pour cela :

ssh-keygen

ssh-copy-id dockeradmin@remote-server

Remarque :pendant ssh-keygen, ne donnez aucune phrase de passe. Laissez-le vide.

3. Autoriser l'accès Sudo pour dockeradmin

Sur votre serveur distant, dans le fichier /etc/sudoers, ajoutez la ligne suivante, qui donnera le privilège sudo complet au compte dockeradmin. Cela signifie que le compte dockeradmin peut exécuter n'importe quelle commande root.

# visudo
dockeradmin     ALL=(ALL) NOPASSWD: ALL

Remarque :la commande visudo modifiera le fichier /ec/sudoers. Vous n'êtes pas obligé d'utiliser "vi /etc/sudoers".

4. Autoriser l'accès externe sur le serveur distant

Assurez-vous que votre serveur distant peut communiquer avec Internet. Ceci est nécessaire, car la commande docker-machine appellera plusieurs commandes yum pour installer certains packages requis.

Donc, juste à des fins de test, assurez-vous que les éléments suivants fonctionnent sur votre serveur.

ping google.com

Si vous n'avez pas la configuration de serveur de noms appropriée, modifiez votre /etc/resolve.conf et ajoutez la ligne suivante. Ou utilisez l'un des serveurs de noms fournis par votre administrateur système.

# vi /etc/resolv.conf
nameserver 4.2.2.2

5. docker-machine Syntaxe de commande du pilote générique

Lorsque vous utilisez le pilote générique, les options suivantes sont disponibles dans la commande docker-machine create.

La syntaxe docker-machine suivante montre toutes les options obligatoires :

docker-machine create -d generic --generic-ip-address {ip-address} {docker-vm-name}

Dans la syntaxe ci-dessus :

  • docker-machine est la commande
  • l'option create indique à docker-machine de créer l'hôte docker-vm distant
  • L'option
  • -d permet de spécifier le type de pilote à utiliser. Ici, nous utilisons le pilote "générique", qui utilisera le client SSH pour se connecter à l'hôte distant
  • –generic-ip-address est de spécifier l'adresse IP distante où l'hôte docker-vm doit être créé.
  • docker-vm-name est le nom que vous souhaitez donner au docker-vm distant qui sera créé par la commande docker-machine. Cela peut être n'importe quoi.

La syntaxe docker-machine suivante affiche toutes les options disponibles :

docker-machine create -d generic --generic-ip-address {ip-address} --generic-ssh-key {private-key} --generic-ssh-user {username} --generic-ssh-port {ssh-port} {docker-vm-name}

Dans la syntaxe ci-dessus :

  • –generic-ssh-key Ceci est facultatif. Si vous ne le spécifiez pas, il parlera à l'agent ssh exécuté sur votre système local. Si vous n'exécutez pas ssh-agent sur votre système local (ordinateur portable), utilisez cette option et spécifiez l'emplacement de votre clé privée sur votre système local.
  • –generic-ssh-user Ceci est facultatif. Par défaut, il utilisera root. Mais, dans la plupart des situations, vous ne voudrez peut-être pas le faire. Alors, spécifiez le nom d'utilisateur que vous voulez que docker-machine utilise lors de la connexion à l'hôte distant.
  • –generic-ssh-port Il s'agit du port SSH du serveur distant. Par défaut, c'est 22.
  • D'autres options sont expliquées dans la syntaxe ci-dessus

6. Créer l'hôte de VM Docker distant

Il est maintenant temps de créer l'hôte docker-vm distant à l'aide de la commande docker-machine create.

docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db

Ce qui suit est la même commande que ci-dessus, mais je l'ai décomposée en plusieurs lignes pour une meilleure lisibilité.

docker-machine create -d generic \
  --generic-ip-address 192.168.100.2 \ 
  --generic-ssh-key $HOME/.ssh/id_rsa \
  --generic-ssh-user dockeradmin \
  --generic-ssh-port 22 \
  dev-db

Dans la commande ci-dessus :

  • Nous avons expliqué toutes les options dans la section de syntaxe ci-dessus.
  • 192.168.100.2 est l'adresse IP de notre hôte distant où l'hôte docker-vm doit être créé.
  • $HOME/.ssh/id_rsa est la clé privée qui se trouve sur votre système local (ordinateur portable)
  • dockeradmin est le nom du nom d'utilisateur Linux sur l'hôte distant
  • dev-db est le nom que j'ai donné pour l'hôte docker-vm que je veux créer sur l'hôte distant. Cela peut être n'importe quoi.

Remarque :Encore une fois, vous exécuterez la commande docker-machine ci-dessus sur votre système local. Vous pouvez utiliser la commande docker-machine fournie avec votre Docker Toolbox.

7. Docker-machine crée une sortie avec succès

Si tout a fonctionné correctement, vous verrez la sortie suivante de la commande docker-machine create.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
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 Docker to this machine, run: C:\Program Files\Docker Toolbox\docker-machine.exe env dev-db

Enfin, si tout fonctionne correctement, vous verrez l'hôte docker vm distant que nous avons créé. Sur votre système local, exécutez ce qui suit :

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL  SWARM  DOCKER    ERRORS
default  *        virtualbox   Running   tcp://192.168.100.10:2376
dev-db   -        generic      Running   tcp://192.168.100.11:2376

Remarque :Eh bien, pour la plupart, rien ne se passe comme prévu et vous pourriez recevoir un message d'erreur. Voici quelques problèmes typiques auxquels j'ai été confronté et la solution à ceux-ci.

8. Erreur 1 :système d'exploitation non valide

La version actuelle de docker-machine ne prend en charge que certaines versions du système d'exploitation sur le serveur distant.

Par exemple, si votre serveur distant s'exécute sur CentOS 6, vous obtiendrez le message d'erreur suivant "/etc/os-release:No such file or directory". En effet, pour CentOS, il recherche CentOS 7.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
(dev-db) Importing SSH key...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Error creating machine: Error detecting OS: Error getting SSH command: Something
 went wrong running an SSH command!
command : cat /etc/os-release
err     : exit status 1
output  : cat: /etc/os-release: No such file or directory

9. Erreur 2 :Impossible d'exécuter la commande root (pas d'accès Sudo)

Si vous obtenez le message d'erreur « Erreur lors de la création de la machine :Erreur lors de l'approvisionnement :état de sortie 1 », après la ligne « Approvisionnement avec centos… », il ne s'agit pas du problème de connexion. docker-machine a pu se connecter correctement au serveur distant.

Mais, dans ce cas, il est incapable d'exécuter la commande root en tant qu'utilisateur dockeradmin. Donc, utilisez visudo et autorisez l'accès sudo complet à l'utilisateur dockeradmin comme nous l'avons expliqué dans l'une des étapes précédentes.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Error creating machine: Error running provisioning: exit status 1

10. Erreur 3 :la commande netstat est manquante

Si vous obtenez le message d'erreur "Error running SSH command:exit status 127" après la ligne "Setting Docker configuration on the remote daemon…", il ne s'agit pas non plus d'un problème de connexion.

Dans ce cas, docker-machine est connecté au SSH distant et dispose d'un accès sudo approprié pour exécuter la commande root, mais certaines des commandes qu'il essaie ont échoué, car il manque la commande "netstat".

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Error running SSH command: exit status 127
Error running SSH command: exit status 127
...
Error running SSH command: exit status 127
Error creating machine: Error running provisioning: Unable to verify the Docker
daemon is listening: Maximum number of retries (10) exceeded

Pour résoudre ce problème, installez le package net-tools sur le serveur distant, qui contient la commande "netstat".

yum install net-tools

J'espère que dans la prochaine version de docker-machine, ils vérifieront probablement si "netstat" existe sur le serveur distant ou non, au début et donneront un message d'erreur valide approprié.

11. Erreur 4 :Version du client Docker incompatible

Si vous obtenez le message d'erreur suivant "Erreur lors de la création de la machine :Erreur lors de l'approvisionnement :état de sortie 1", il est possible que le client docker de votre système local (ordinateur portable) ne corresponde pas au client docker du système distant.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
(dev-db) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Detecting operating system of created instance...
Detecting the provisioner...
Provisioning with centos...
Error creating machine: Error running provisioning: exit status 1

Par exemple, sur le système local :

$ docker version
Client:
 Version:      1.9.1

Sur serveur distant :

# docker version
Client:
 Version:      1.8.2

Dans l'exemple ci-dessus, la version locale du docker est 1.9.1, mais la version distante du docker est une ancienne version 1.8.2. Donc, ici, nous avons une incompatibilité, et la création de docker-machine ne fonctionnera pas et échouera comme indiqué ci-dessus.

Dans le scénario ci-dessus, le moteur docker a été installé séparément sur le serveur distant, qui avait une version client docker différente de la version client docker fournie avec la machine docker (boîte à outils docker) sur le système local.

Donc, dans ce cas, supprimez le docker de votre système distant comme indiqué ci-dessous.

# rpm -qa | grep docker
docker-selinux-1.8.2-10.el7.centos.x86_64
docker-1.8.2-10.el7.centos.x86_64

# rpm -ev docker-selinux
Preparing packages...
docker-selinux-1.8.2-10.el7.centos.x86_64

# rpm -ev docker
Preparing packages...
docker-1.8.2-10.el7.centos.x86_64

Désormais, lorsque vous exécutez la commande docker-machine sur votre système local, il installe automatiquement le moteur docker approprié et le client docker sur le serveur distant qui sera compatible avec le client docker sur la machine locale.

12. Erreur 5 :SELinux ou le pare-feu bloque l'accès

Par défaut, la nouvelle machine docker vm que nous avons créée s'exécutera sur le port TCP 2376.

Sur votre serveur distant, assurez-vous d'avoir une règle de pare-feu appropriée qui autorisera le port TCP 2376. Si vous rencontrez toujours des problèmes, juste temporairement pour exclure la possibilité que firewalld bloque l'accès, arrêtez firewalld et voyez ce qui se passe.

systemctl stop firewalld

Encore une fois, juste à des fins de débogage, pour une raison quelconque, si vous souhaitez désactiver le pare-feu, vous pouvez le faire comme indiqué ci-dessous :

systemctl disable firewalld

La dernière version de Docker fonctionne à merveille avec SELinux, aucun problème là-bas. Mais, dans une version antérieure de docker, il y avait quelques bogues liés à docker et SELinux.

Donc, si vous rencontrez des problèmes, essayez de désactiver temporairement SELinux et voyez si cela résout le problème. Pour désactiver définitivement SELinux, modifiez le fichier /etc/selinux/config en conséquence.

setenforce Permissive

getenforce

Notez également que si SSH n'est pas en mesure d'établir une connexion entre votre système local et le serveur distant, docker-machine affichera le message d'erreur suivant "Erreur en attente de SSH :Trop de tentatives en attente de SSH". Pour résoudre ce problème, assurez-vous d'implémenter l'authentification sans mot de passe SSH, comme expliqué dans l'une des étapes ci-dessus.

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db
Running pre-create checks...
Creating machine...
Waiting for machine to be running, this may take a few minutes...
Machine is running, waiting for SSH to be available...
Error creating machine: Error waiting for SSH: Too many retries waiting for SSH
to be available.  Last error: Maximum number of retries (60) exceeded

Lorsque tous les problèmes ci-dessus sont résolus, docker-machine fonctionnera sans aucun problème, comme indiqué ci-dessous :

$ docker-machine create -d generic --generic-ip-address 192.168.100.2 --generic-ssh-key $HOME/.ssh/id_rsa --generic-ssh-user dockeradmin --generic-ssh-port 22 dev-db

$ docker-machine ls
NAME     ACTIVE   DRIVER       STATE     URL  SWARM  DOCKER    ERRORS
default  *        virtualbox   Running   tcp://192.168.100.10:2376
dev-db   -        generic      Running   tcp://192.168.100.11:2376

Linux
  1. Comment créer un utilisateur Linux avec Ansible

  2. Ssh - Comment se connecter à un PC via un autre PC en utilisant Ssh ?

  3. Comment Ssh vers un serveur en utilisant un autre serveur ? ?

  4. Comment connecter un hôte distant à l'aide de la commande ssh

  5. comment tunneliser Windows Remote Desktop via ssh à l'aide d'une machine Linux?

Comment configurer une connexion SSH sans mot de passe à l'aide de ssh-keygen ?

Comment créer une phrase de passe de clé SSH sous Linux

Comment effectuer une sauvegarde Linux à distance à l'aide de SSH

Comment utiliser SSH pour se connecter à un serveur distant

Comment :Administration à distance de FreeBSD

Comment créer une partition à l'aide de la commande "parted"