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