Para la elaboración del artículo hemos utilizado docker 1.12 y dos equipos ubuntu 16.04.1 LTS virtualizados con Virtualbox
Guía rápida de aprovisionamiento de una máquina remota utilizando docker-machine y el driver genérico. Se trata por tanto de instalar de docker forma remota desde un equipo local.
Para el artículo vamos a suponer que
- la máquina remota se llama remotehost
- la cuenta del usuario del equipo remoto es udocker
- la maquina local donde ejecutamos docker-machine es sourcehost
Pasos previos
En la máquina remota remotehost donde queremos aprovisionar o instalar docker necesitamos:
- usuario con permisos o privilegio sudo sin necesidad de introducir la contraseña
- acceso ssh sin necesidad de introducir la contraseña del usuario, es decir, login remoto por clave rsa
Resumiendo estos pasos muy brevemente, en el equipo remoto remotehost hacemos
Editar el fichero sudoers para permitir ejecutar comandos root sin necesidad de introducir la contraseña
Suponiendo que el usuario udocker con el que hacemos login tiene permisos para ejecutar comandos root y se encuentra en el grupo sudo.
$ sudo view /etc/sudoers
y modificar la siguiente línea
%sudo ALL=(ALL:ALL) ALL
por
%sudo ALL=(ALL) NOPASSWD:ALL
Permitir el login en el equipo remoto utilizando clave rsa
Desde la máquina sourcehost donde vamos a ejecutar docker-machine debemos generar, si no la tenemos, la clave rsa y luego copiarla al equipo remoto.
# Solo en el caso de no tener clave rsa $ ssh-keygen ...
Y copiamos en el equipo remoto remotehost desde sourcehost nuestra clave rsa
$ ssh-copy-id udocker@remotehost /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/udocker/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys udocker@remotehost's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'udocker@remotehost'" and check to make sure that only the key(s) you wanted were added. $ ssh udocker@remotehost Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-31-generic x86_64)
Aprovisionar la máquina remota
Desde el equipo sourcehost ejecutamos el comando docker-machine.
$ docker-machine create --driver generic --generic-ip-address=192.168.56.102 --generic-ssh-user=udocker --generic-ssh-key ~/.ssh/id_rsa node-2 Running pre-create checks... Creating machine... (node-2) Importing SSH key... Waiting for machine to be running, this may take a few minutes... Detecting operating system of created instance... Waiting for SSH to be available... Detecting the provisioner... Provisioning with ubuntu(systemd)... Installing Docker... 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 your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env node-2
Una vez hemos instalado docker en el equipo remoto remotehost, desde el equipo local sourcehost podemos ver la instancia de docker ejecutandose.
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS node-2 - generic Running tcp://192.168.56.102:2376 v1.12.0
Y para conectarnos al daemon de docker corriendo en remotehost desde el equipo local sourcehost basta con ejecutar eval $(docker-machine env node-2).
Las variables que se configuran en el equipo local para enviar las peticiones al daemon de docker en remotehost son:
$ docker-machine env node-2 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.56.102:2376" export DOCKER_CERT_PATH="/home/user.docker/.docker/machine/machines/node-2" export DOCKER_MACHINE_NAME="node-2" # Run this command to configure your shell: # eval $(docker-machine env node-2)
Eliminar la máquina remota
Si fuera necesario podemos eliminar la referencia al node-2 utilizando docker-machine.
$ docker-machine rm node-2 About to remove node-2 Are you sure? (y/n): y Successfully removed node-2
Como vemos los pasos necesario para instalar docker de forma remota son bastantes sencillos. Podemos repetir los mismos pasos para aprovisionar tantos equipo con docker como necesitemos. A partir de este momento podríamos crear un cluster de nodos docker con docker swarm.