GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo crear una VM remota usando el controlador SSH genérico de docker-machine

Usando docker, puede empaquetar su aplicación empresarial en un contenedor autónomo, que se garantiza que se ejecutará en cualquier entorno.

Esto facilita tanto al desarrollador como a los administradores de sistemas la administración de la aplicación. Si es administrador, ya no tiene que escuchar esta excusa del desarrollador:"¡Pero funciona en mi entorno de desarrollo!"

Usando Docker Machine, puede instalar y configurar Docker Engine en un servidor remoto. Una vez que se instala la ventana acoplable, desde su máquina local (computadora portátil), puede administrar la ventana acoplable de forma remota.

En este tutorial, hablaremos específicamente sobre el controlador genérico utilizado por docker-machine, que utilizará el cliente SSH para administrar el host docker remoto.

1. Crear usuario dockeradmin en host remoto

Primero, cree una cuenta de usuario de Linux en el servidor remoto. Realmente no tiene que usar "dockeradmin" como nombre de usuario, puede ser cualquier cosa. Incluso puede utilizar su propio nombre de usuario.

adduser dockeradmin

passwd dockeradmin

2. Generar par de claves pública-privada SSH en el host local

Luego, en su host local (computadora portátil), cree una clave SSH pública y privada usando ssh-keygen. También debe copiar la clave privada en el servidor remoto.

Explicamos cómo hacerlo en este artículo:Realizar inicio de sesión SSH remoto sin contraseña

Pero, en resumen, esto es lo que debe hacer para esto:

ssh-keygen

ssh-copy-id dockeradmin@remote-server

Nota:durante ssh-keygen, no proporcione ninguna frase de contraseña. Déjalo vacío.

3. Permitir acceso a Sudo para dockeradmin

En su servidor remoto, en el archivo /etc/sudoers, agregue la siguiente línea, que otorgará privilegios sudo completos a la cuenta dockeradmin. Esto significa que la cuenta dockeradmin puede ejecutar cualquier comando raíz.

# visudo
dockeradmin     ALL=(ALL) NOPASSWD: ALL

Nota:el comando visudo modificará el archivo /ec/sudoers. No tienes que usar "vi /etc/sudoers".

4. Permitir acceso externo en servidor remoto

Asegúrese de que su servidor remoto pueda comunicarse con Internet. Esto es obligatorio, ya que el comando docker-machine invocará varios comandos yum para instalar ciertos paquetes requeridos.

Entonces, solo con fines de prueba, asegúrese de que lo siguiente funcione en su servidor.

ping google.com

Si no tiene la configuración adecuada del servidor de nombres, modifique su /etc/resolve.conf y agregue la siguiente línea. O utilice uno de los servidores de nombres proporcionados por el administrador del sistema.

# vi /etc/resolv.conf
nameserver 4.2.2.2

5. Sintaxis del comando del controlador genérico docker-machine

Cuando utiliza el controlador genérico, las siguientes opciones están disponibles en el comando de creación de docker-machine.

La siguiente sintaxis de docker-machine muestra todas las opciones obligatorias:

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

En la sintaxis anterior:

  • docker-machine es el comando
  • la opción create le dice a docker-machine que cree el host docker-vm remoto
  • La opción
  • -d es para especificar qué tipo de controlador usar. Aquí, estamos usando el controlador "genérico", que usará el cliente SSH para conectarse al host remoto
  • –generic-ip-address es para especificar la dirección IP remota donde se debe crear el host docker-vm.
  • docker-vm-name es el nombre que desea dar a la docker-vm remota que se creará con el comando docker-machine. Esto puede ser cualquier cosa.

La siguiente sintaxis de docker-machine muestra todas las opciones 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}

En la sintaxis anterior:

  • –generic-ssh-key Esto es opcional. Cuando no especifica esto, se comunicará con el agente ssh que se ejecuta en su sistema local. Si no está ejecutando ssh-agent en su sistema local (computadora portátil), use esta opción y especifique la ubicación de su clave privada en su sistema local.
  • –generic-ssh-user Esto es opcional. Por defecto, usará root. Pero, en la mayoría de las situaciones, es posible que no desee hacer esto. Por lo tanto, especifique el nombre de usuario que desea que use la máquina acoplable mientras se conecta al host remoto.
  • –generic-ssh-port Este es el puerto SSH del servidor remoto. Por defecto es 22.
  • Otras opciones se explican en la sintaxis anterior

6. Cree el host de VM de Docker remoto

Ahora es el momento de crear el host docker-vm remoto mediante el 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

El siguiente es el mismo comando que el anterior, pero lo dividí en varias líneas para facilitar la lectura.

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

En el comando anterior:

  • Hemos explicado todas las opciones en la sección de sintaxis anterior.
  • 192.168.100.2 es la dirección IP de nuestro host remoto donde se debe crear el host docker-vm.
  • $HOME/.ssh/id_rsa es la clave privada que se encuentra en su sistema local (computadora portátil)
  • dockeradmin es el nombre del nombre de usuario de Linux en el host remoto
  • dev-db es el nombre que le di al host docker-vm que quiero crear en el host remoto. Esto puede ser cualquier cosa.

Nota:Nuevamente, ejecutará el comando docker-machine anterior en su sistema local. Puede usar el comando docker-machine que viene con Docker Toolbox.

7. Salida exitosa de creación de máquina docker

Si todo funcionó correctamente, verá el siguiente resultado del 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
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

Finalmente, si todo funciona correctamente, verá el host remoto docker vm que creamos. En su sistema local, ejecute lo siguiente:

$ 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:Bueno, en su mayor parte, nada sale según lo planeado y es posible que reciba algún mensaje de error. Los siguientes son algunos problemas típicos que enfrenté y la solución para ellos.

8. Error 1:sistema operativo no válido

La versión actual de docker-machine solo admite ciertas versiones del sistema operativo en el servidor remoto.

Por ejemplo, si su servidor remoto se ejecuta en CentOS 6, obtendrá el siguiente mensaje de error "/etc/os-release:No such file or directory". Esto se debe a que CentOS busca 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. Error 2:No se puede ejecutar el comando raíz (sin acceso a Sudo)

Si recibe el mensaje de error "Error al crear la máquina:Error al ejecutar el aprovisionamiento:salir del estado 1", después de la línea "Aprovisionamiento con centos...", entonces no es el problema de conexión. docker-machine pudo conectarse correctamente al servidor remoto.

Pero, en este caso, no puede ejecutar el comando raíz como usuario dockeradmin. Por lo tanto, use visudo y permita acceso sudo completo al usuario dockeradmin como explicamos en uno de los pasos anteriores.

$ 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. Error 3:falta el comando netstat

Si recibe el mensaje de error "Error al ejecutar el comando SSH:estado de salida 127" después de la línea "Estableciendo la configuración de Docker en el demonio remoto...", tampoco se trata de un problema de conexión.

En este caso, docker-machine se conectó al SSH remoto y tiene el acceso sudo apropiado para ejecutar el comando raíz, pero algunos de los comandos que está intentando fallaron porque falta el 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

Para solucionar este problema, instale el paquete net-tools en el servidor remoto, que contiene el comando "netstat".

yum install net-tools

Espero que en la próxima versión de docker-machine, probablemente verifiquen si "netstat" existe en el servidor remoto o no, al principio y den un mensaje de error válido apropiado.

11. Error 4:la versión del cliente de Docker no coincide

Si recibe el siguiente mensaje de error "Error al crear la máquina:Error al ejecutar el aprovisionamiento:estado de salida 1", existe la posibilidad de que el cliente de la ventana acoplable en su sistema local (computadora portátil) no coincida con el cliente de la ventana acoplable en el 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

Por ejemplo, en el sistema local:

$ docker version
Client:
 Version:      1.9.1

En servidor remoto:

# docker version
Client:
 Version:      1.8.2

En el ejemplo anterior, la versión de la ventana acoplable local es 1.9.1, pero la versión de la ventana acoplable remota es una 1.8.2 anterior. Por lo tanto, aquí tenemos una falta de coincidencia, y docker-machine create no funcionará y fallará como se muestra arriba.

En el escenario anterior, el motor de la ventana acoplable se instaló por separado en el servidor remoto, que tenía una versión del cliente de la ventana acoplable diferente a la versión del cliente de la ventana acoplable que venía con la máquina acoplable (caja de herramientas de la ventana acoplable) en el sistema local.

Entonces, en este caso, elimine la ventana acoplable de su sistema remoto como se muestra a continuación.

# 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

Ahora, cuando ejecute el comando docker-machine en su sistema local, instalará automáticamente el motor de docker apropiado y el cliente de docker en el servidor remoto que será compatible con el cliente de docker en la máquina local.

12. Error 5:Acceso bloqueado por SELinux o cortafuegos

De manera predeterminada, la nueva máquina docker vm que creamos se ejecutará en el puerto TCP 2376.

En su servidor remoto, asegúrese de tener una regla de firewall adecuada que permita el puerto TCP 2376. Si aún tiene problemas, solo temporalmente para descartar la posibilidad de que firewalld bloquee el acceso, detenga firewalld y vea qué sucede.

systemctl stop firewalld

Nuevamente, solo con fines de depuración, por alguna razón, si desea deshabilitar el firewall, puede hacerlo como se muestra a continuación:

systemctl disable firewalld

La última versión de Docker funciona a la perfección con SELinux, sin problemas. Pero, en una versión anterior de Docker, había algunos errores relacionados con Docker y SELinux.

Entonces, si tiene algún problema, intente deshabilitar SELinux temporalmente y vea si soluciona el problema. Para deshabilitar permanentemente SELinux, modifique el archivo /etc/selinux/config en consecuencia.

setenforce Permissive

getenforce

Además, tenga en cuenta que si SSH no puede establecer una conexión desde su sistema local al servidor remoto, docker-machine mostrará el siguiente mensaje de error "Error esperando SSH:Demasiados reintentos esperando SSH". Para solucionar esto, asegúrese de implementar la contraseña SSH sin autenticación como se explica en uno de los pasos anteriores.

$ 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

Cuando se solucionen todos los problemas anteriores, docker-machine funcionará sin ningún problema, como se muestra a continuación:

$ 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. Cómo crear un rol de IAM en AWS usando Terraform

  2. Cómo crear un volumen físico en Linux usando LVM

  3. Ssh:¿cómo conectarse a una PC a través de otra PC usando Ssh?

  4. Cómo conectar un host remoto usando el comando ssh

  5. ¿Cómo hacer un túnel de Windows Remote Desktop a través de ssh usando una caja de Linux?

¿Cómo configurar el inicio de sesión SSH sin contraseña usando ssh-keygen?

Cómo crear una frase de contraseña de clave SSH en Linux

Cómo realizar una copia de seguridad remota de Linux mediante SSH

Cómo usar SSH para conectarse a un servidor remoto

Cómo:Administración remota de FreeBSD

Cómo crear una partición usando el comando "partid"