GNU/Linux >> Linux Esercitazione >  >> Linux

Come creare una macchina virtuale remota utilizzando il driver SSH generico della macchina mobile

Utilizzando la finestra mobile, puoi impacchettare la tua applicazione aziendale in un contenitore autonomo, che è garantito per l'esecuzione su qualsiasi ambiente.

Ciò semplifica la gestione dell'applicazione sia per gli sviluppatori che per gli amministratori di sistema. Se sei un amministratore, non devi più sentire questa scusa dallo sviluppatore:"Ma funziona nel mio ambiente di sviluppo!"

Utilizzando Docker Machine, puoi installare e configurare Docker Engine su un server remoto. Una volta installata la finestra mobile, dal tuo computer locale (laptop), puoi gestirla in remoto.

In questo tutorial parleremo in particolare del driver generico utilizzato da docker-machine, che utilizzerà il client SSH per gestire l'host docker remoto.

1. Crea un utente dockeradmin sull'host remoto

Innanzitutto, crea un account utente Linux sul server remoto. Non devi davvero usare "dockeradmin" come nome utente, può essere qualsiasi cosa. Puoi persino utilizzare il tuo nome utente.

adduser dockeradmin

passwd dockeradmin

2. Genera coppia di chiavi pubblica-privata SSH sull'host locale

Quindi, sul tuo host locale (laptop), crea una chiave SSH pubblica e privata usando ssh-keygen. Dovresti anche copiare la chiave privata sul server remoto.

Abbiamo spiegato come farlo in questo articolo:Esegui accesso SSH remoto senza password

Ma, in breve, ecco cosa devi fare per questo:

ssh-keygen

ssh-copy-id dockeradmin@remote-server

Nota:durante ssh-keygen, non fornire alcuna passphrase. Lascialo vuoto.

3. Consenti accesso a Sudo per Dockeradmin

Sul tuo server remoto, nel file /etc/sudoers, aggiungi la seguente riga, che darà il privilegio sudo completo all'account dockeradmin. Ciò significa che l'account dockeradmin può eseguire qualsiasi comando root.

# visudo
dockeradmin     ALL=(ALL) NOPASSWD: ALL

Nota:il comando visudo modificherà il file /ec/sudoers. Non è necessario utilizzare "vi /etc/sudoers".

4. Consenti accesso esterno su server remoto

Assicurati che il tuo server remoto possa parlare con Internet. Questo è obbligatorio, poiché il comando docker-machine invocherà diversi comandi yum per installare determinati pacchetti require.

Quindi, solo a scopo di test, assicurati che quanto segue funzioni sul tuo server.

ping google.com

Se non disponi di una configurazione appropriata del server dei nomi, modifica il tuo /etc/resolve.conf e aggiungi la riga seguente. In alternativa, utilizza uno dei server dei nomi forniti dall'amministratore di sistema.

# vi /etc/resolv.conf
nameserver 4.2.2.2

5. Sintassi del comando driver generico docker-machine

Quando si utilizza il driver generico, nel comando docker-machine create sono disponibili le seguenti opzioni.

La seguente sintassi docker-machine mostra tutte le opzioni obbligatorie:

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

Nella sintassi sopra:

  • Docker-machine è il comando
  • L'opzione
  • create dice a docker-machine di creare l'host remoto docker-vm
  • L'opzione
  • -d serve per specificare il tipo di driver da utilizzare. Qui stiamo usando il driver "generico", che utilizzerà il client SSH per connettersi all'host remoto
  • –indirizzo-ip-generico serve a specificare l'indirizzo IP remoto in cui deve essere creato l'host docker-vm.
  • docker-vm-name è il nome che vuoi dare al docker-vm remoto che verrà creato dal comando docker-machine. Può essere qualsiasi cosa.

La seguente sintassi docker-machine mostra tutte le opzioni disponibili:

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}

Nella sintassi sopra:

  • –generic-ssh-key Questo è facoltativo. Quando non lo specifichi, parlerà con ssh-agent in esecuzione sul tuo sistema locale. Se non stai eseguendo ssh-agent sul tuo sistema locale (laptop), usa questa opzione e specifica la posizione della tua chiave privata sul tuo sistema locale.
  • –generic-ssh-user Questo è facoltativo. Per impostazione predefinita, utilizzerà root. Ma nella maggior parte delle situazioni potresti non volerlo fare. Quindi, specifica il nome utente che vuoi che la macchina mobile utilizzi durante la connessione all'host remoto.
  • –generic-ssh-port Questa è la porta SSH del server remoto. Per impostazione predefinita è 22.
  • Altre opzioni sono spiegate nella sintassi sopra

6. Crea l'host di macchine virtuali Docker remoto

Ora è il momento di creare l'host docker-vm remoto utilizzando il comando 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

Il seguente è lo stesso comando di cui sopra, ma l'ho suddiviso in più righe per una facile leggibilità.

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

Nel comando sopra:

  • Abbiamo spiegato tutte le opzioni nella sezione della sintassi sopra.
  • 192.168.100.2 è l'indirizzo IP del nostro host remoto in cui deve essere creato l'host docker-vm.
  • $HOME/.ssh/id_rsa è la chiave privata che si trova sul tuo sistema locale (laptop)
  • dockeradmin è il nome del nome utente Linux sull'host remoto
  • dev-db è il nome che ho dato per l'host docker-vm che voglio creare sull'host remoto. Può essere qualsiasi cosa.

Nota:ancora una volta, eseguirai il comando docker-machine sopra sul tuo sistema locale. Puoi utilizzare il comando docker-machine fornito con Docker Toolbox.

7. Creazione di output riuscita della Docker Machine

Se tutto ha funzionato correttamente, vedrai il seguente output dal comando di creazione della macchina mobile.

$ 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

Infine, se tutto funziona correttamente, vedrai l'host vm Docker remoto che abbiamo creato. Sul tuo sistema locale, esegui quanto segue:

$ 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

Nota:Bene, per la maggior parte, nulla va come previsto e potresti ricevere un messaggio di errore. Di seguito sono riportati alcuni problemi tipici che ho affrontato e la soluzione per quelli.

8. Errore 1:sistema operativo non valido

La versione corrente di docker-machine supporta solo alcune versioni del sistema operativo sul server remoto.

Ad esempio, se il tuo server remoto è in esecuzione su CentOS 6, riceverai il seguente messaggio di errore "/etc/os-release:No such file or directory". Questo perché per CentOS cerca 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. Errore 2:impossibile eseguire il comando root (nessun accesso sudo)

Se viene visualizzato il messaggio di errore "Errore durante la creazione della macchina:errore durante l'esecuzione del provisioning:stato di uscita 1", dopo la riga "Provisioning with centos...", non si tratta di un problema di connessione. docker-machine è riuscita a connettersi correttamente al server remoto.

Ma, in questo caso, non è in grado di eseguire il comando root come utente dockeradmin. Quindi, usa visudo e consenti l'accesso completo sudo all'utente dockeradmin come spiegato in uno dei passaggi precedenti.

$ 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. Errore 3:comando netstat mancante

Se ricevi il messaggio di errore "Errore durante l'esecuzione del comando SSH:stato di uscita 127" dopo la riga "Impostazione della configurazione Docker sul demone remoto...", anche questo non è un problema di connessione.

In questo caso, la docker-machine si è collegata all'SSH remoto e dispone dell'accesso sudo appropriato per eseguire il comando root, ma alcuni dei comandi che sta provando non sono riusciti, perché manca il comando "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

Per risolvere questo problema, installa il pacchetto net-tools sul server remoto, che contiene il comando "netstat".

yum install net-tools

Spero che nella prossima versione di docker-machine, probabilmente verificheranno se "netstat" esiste o meno sul server remoto, all'inizio e forniranno un messaggio di errore valido appropriato.

11. Errore 4:mancata corrispondenza della versione del client Docker

Se viene visualizzato il seguente messaggio di errore "Errore durante la creazione della macchina:Errore durante l'esecuzione del provisioning:stato di uscita 1", è possibile che il client Docker sul sistema locale (laptop) non corrisponda al client Docker sul sistema remoto.

$ 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

Ad esempio, sul sistema locale:

$ docker version
Client:
 Version:      1.9.1

Sul server remoto:

# docker version
Client:
 Version:      1.8.2

Nell'esempio sopra, la versione della finestra mobile locale è 1.9.1, ma la versione della finestra mobile remota è una precedente 1.8.2. Quindi, qui abbiamo una mancata corrispondenza e la creazione della finestra mobile non funzionerà e fallirà come mostrato sopra.

Nello scenario precedente, il motore Docker è stato installato separatamente sul server remoto, che aveva una versione del client Docker diversa rispetto alla versione del client Docker fornita con la macchina Docker (Casella degli strumenti Docker) sul sistema locale.

Quindi, in questo caso, rimuovi la finestra mobile dal tuo sistema remoto come mostrato di seguito.

# 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

Ora, quando esegui il comando docker-machine sul tuo sistema locale, installerà automaticamente il motore docker appropriato e il client docker sul server remoto che sarà compatibile con il client docker sul computer locale.

12. Errore 5:SELinux o Firewall che bloccano l'accesso

Per impostazione predefinita, la nuova macchina Docker vm che abbiamo creato verrà eseguita sulla porta TCP 2376.

Sul tuo server remoto, assicurati di avere una regola firewall appropriata che consentirà la porta TCP 2376. Se hai ancora problemi, solo temporaneamente per escludere la possibilità che il firewalld blocchi l'accesso, interrompi firewalld e guarda cosa succede.

systemctl stop firewalld

Ancora una volta, solo per scopi di debug, per qualche motivo, se ti piace disabilitare il firewalld, puoi farlo come mostrato di seguito:

systemctl disable firewalld

L'ultima versione di Docker funziona magnificamente con SELinux, senza problemi. Ma, in una versione precedente di docker, c'erano alcuni bug relativi a docker e SELinux.

Quindi, se stai riscontrando problemi, prova a disabilitare temporaneamente SELinux e vedi se risolve il problema. Per disabilitare permanentemente SELinux, modificare di conseguenza il file /etc/selinux/config.

setenforce Permissive

getenforce

Inoltre, tieni presente che se SSH non è in grado di stabilire una connessione dal tuo sistema locale al server remoto, la docker-machine visualizzerà il seguente messaggio di errore "Errore in attesa di SSH:troppi tentativi in ​​attesa di SSH". Per risolvere il problema, assicurati di implementare la password SSH meno l'autenticazione come spiegato in uno dei passaggi precedenti.

$ 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

Quando tutti i problemi di cui sopra sono stati risolti, docker-machine funzionerà senza problemi come mostrato di seguito:

$ 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. Come creare un ruolo IAM in AWS utilizzando Terraform

  2. Come creare un volume fisico in Linux usando LVM

  3. Ssh:come connettersi a un PC tramite un altro PC utilizzando Ssh?

  4. Come eseguire Ssh su un server utilizzando un altro server??

  5. come eseguire il tunneling di Windows Remote Desktop tramite ssh utilizzando una macchina Linux?

Come configurare l'accesso SSH senza password utilizzando ssh-keygen?

Come creare una passphrase chiave SSH in Linux

Come eseguire un backup Linux remoto utilizzando SSH

Come utilizzare SSH per connettersi a un server remoto

Procedura:Amministrazione remota di FreeBSD

Come creare una partizione usando il comando "separato".