Creando una VM usando el driver generic de docker-machine

En uno de nuestros artículos Creando un host docker en AWS adelantamos este último artículo en el que usaremos el driver generic para crear una máquina en cualquier otro servidor que no este en el listado de plataformas que docker-machine tiene definidas, puede ver la lista en Drivers de docker-machine.

Servidor remoto
Para el presente caso hemos preparado un servidor remoto con CentOS 7.0 en el que hemos instalado docker siguiendo las indicaciones de

Creando un usuario admin en host remoto
Tenemos logearnos en nuestro host remoto y crear una cuenta de usuario:

adduser dockeradmin
passwd dockeradmin

Generando clave pública/privada SSH en nuestro equipo local

El siguiente paso es crear una clave pública y privada utilizando ssh-keygen, y debe copiar la clave privada al servidor remoto, algo rápido sería:

ssh-keygen
ssh-copy id dockeradmin@server

Dejar en blanco el passphrase durante la creación de las claves (ssh-keygen)

Dar acceso Sudo al usuario dockeradmin
En el servidor remoto añadir la siguiente línea al archivo /etc/suudoers para otorgarle privilegios sudo al usuario dockeradmin, con ello dicho usuario podrá ejecutar comandos como root.

dockeradmin    ALL=(ALL) NOPASSWD: ALL

Para editar el archivo puede usar:

$ visudo /etc/sudoers

Logearse como dockeradmin en el servidor y probar si esta conectado a internet, para probarlo basta con hacer un ping:

$ ping google.com

Y si tuviera problemas al resolver el dominio, puede hacer una modificación en el archivo /etc/resolve.conf y añadir la siguiente línea:

$ vi /etc/resolv.conf
nameserver 4.2.2.2

Acceso a netstat
El usuario tiene que tener acceso a netstat. Si está usando un grs kernel necesitará crear un enlace para acceder a netstat para el usuario dockeradmin:

$ cat netstat 
#!/bin/bash
exec /usr/bin/sudo /bin/netstat "$@"
$ chmod +x netstat
$ sudo cp netstat /usr/local/bin/

Puerto de comunicación con el demonio de docker
* Docker-Machine utiliza el puerto 2376 para comunicarse con el demonio de docker, puede que necesite abrir el puerto en el servidor remoto:

iptables -t filter -A INPUT -p tcp --dport 2376 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 2376 -j ACCEPT

Driver de almacenamiento
Docker-Machine y el driver genérico no trabajan con el driver de almacenamiento aufs, necesitará especificar storage-driver a devicemapper en el demonio Docker del servidor. Puede hacer sobreescribiendo parte de la configuración de docker creando/editando el fichero /etc/systemd/system/docker.service.

$ sudo cat /etc/systemd/system/docker.service
[Service]
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic 
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
Environment=

[Install]
WantedBy=multi-user.target

Comando Docker-Machine para usar un driver genérico
Para crear una máquina en un host con driver genérico usaremos el siguiente comando:

docker-machine create -d generic --generic-ip-address {direccion-ip} --engine-storage-driver devicemapper {nombre-docker-vm}

docker-machine es el comando.
create le indica que vamos a crear una máquina en un servidor remoto.
-d específica el tipo de driver que vamos a usar, para nuestro caso generic y así usará el cliente SSH para conectarse al servidor remoto.
–generic-ip-address para especificar la dirección ip remota donde la máquina será creada.
–engine-storage-driver específica el driver que almacenamiento que se utilizará, para el caso del driver genérico se usa devicemapper.
nombre-docker-vmes el nombre que le daremos a la máquina que se creará con este comando.

docker-machine create -d generic --generic-ip-address {direccion-ip} --generic-ssh-key {clave-privada} --generic-ssh-user {nombre-usuario} --generic-ssh-port {puerto-ssh} --engine-storage-driver devicemapper {nombre-docker-vm}

Los nuevos parámetros indican:

–generic-ssh-key es opcional, especifica la ubicación de la clave privada en el sistema de ficheros local. Cuando use el comando desde el equipo local donde ejecuto el ssh-keygen no es necesario usar este parámetro.
–generic-ssh-user es opcional, su valor predeterminado es root.
–generic-ssh-port es el puerto SSH del servidor remoto, 22 es el valor predeterminado.

Creando una máquina en el servidor remoto
Llego el momento, ahora crearemos una máquina con el siguiente comando desde nustro equipo local:

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

192.168.1.27 es la dirección ip de nuestro servidor remoto.
$HOME/.ssh/id_rsaes el fichero de la clave privada.
dockeradmin es el nombre de usuario del servidor remoto que creamos al principio.
dev-mysql es el nombre que tendrá nuestro máquina Docker que se creará en el servidor remoto.

El comando mostrará una salida similar a:

Running pre-create checks...
Creating machine...
(dev-mysql) 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!

Por último podemos que la lista de las máquinas creadas:

$ docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
dev-mysql * generic Running tcp://192.168.1.109:2376 v1.11.2

Cambiando de entorno
Puede indicarle a su cliente Docker que se conecte al Docker Engine del servidor remoto:

$ eval $(docker-machine env dev-mysql)

En este momento al ejecutar un docker ps podrá ver los contenedores remotos.

Posible problema
Si al realizar el proceso de creación de la máquina no termina de crearse la máquina correctamente, puede que sea un problema de certificado, esto es porque el driver genérico sólo trabaja en servidores remotos que tengan instalado y ejecutando la interfaz HTTPS. Por tanto debe terminar de preparar el servidor. Se habla de este punto en el issue 1357 de Docker-Machine

  • Generar todos las claves en el servidor remoto e inicializar el Docker Engine usando TLS, en la web de docker.com puede seguir las instrucciones https://docs.docker.com/engine/security/https/. Una vez creados los certificados, debemos copiarlos a nuestro equipo local en la carpeta $HOME/.docker/machine/machines/{nombre-vm} y en el archivo $HOME/.docker/machine/machines/{nombre-vm}/config.json modificar la línea:

    “CaCertPath”: “/Users/mdesales/.docker/machine/machines/{nombre-vm}/ca.pem”,

  • Si obtiene un error bad certificate puede resolverlo

    $ export DOCKER_OPTS=”-H $DOCKER_HOST –tls –tlskey $DOCKER_CERT_PATH/server-key.pem –tlscert $DOCKER_CERT_PATH/server.pem –tlsverify –tlscacert $DOCKER_CERT_PATH/ca.pem ”
    $ alias docker=”docker $DOCKER_OPTS “

Nos vemos en un próximo artículo, si quieres enterarte cuando publiquemos uno puedes seguirnos en twitter @dondockercom

One thought on “Creando una VM usando el driver generic de docker-machine

  • JodivlScmrrr

    I see your page needs some fresh content. Writing manually is time consuming,
    there is tool for this task. Just search in gogle for – Fejlando’s tips

    Responder

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *