domingo, 20 de septiembre de 2015

Creación de un sistema BASE para DOCKER

Creación de un sistema BASE para DOCKER

En este post reutilizaremos la máquina virtual creada en el post anterior box-sistema-base-para-vagrant-desde-cero


  • Ubuntu 14.04 x64
  • VirtualBox 5.0.2 + ExtensionPack
  • Docker version 1.7.1
  • CentOS 7 x64  (El nodo virtual del post anterior lo llamamos vmcentos7x64)


Arrancamos la máquina virtual creada en el post anterior:

VBoxManage startvm --type headless vmcentos7x64

Nos conectamos a ella (si estamos usando la máquina del post anterior, el NAT estaba realizado sobre el puerto 2222).

ssh root@localhost -p 2222

Creamos una imagen completa del sistema operativo con usuario root, obviando los filsystems virtuales /proc y /sys ya que se crean por el kernel... 

tar --numeric-owner --exclude=/proc --exclude=/sys -cvf /root/vmcentos7x64-base.tar /


Esto creará un tar con todo el sistema en /root/vmcentos7x64-base.tar, sacamos el fichero del sistema virtualizado con VirtualBox y lo llevamos por ejemplo a nuestro propio host.

scp -P 2222 root@localhost:/root/vmcentos7x64-base.tar /tmp

Ahora, paramos la máquina virtual ya que no la necesitamos.

VBoxManage controlvm vmcentos7x64 poweroff

Importamos la imagen creada de los filesystems de la máquina virtual en docker con el nombre vmcentos7x64-base en nuestro ejemplo.

cat /tmp/vmcentos7x64-base.tar | docker import - vmcentos7x64-base

Tras unos segundos nos aparece el id del contenedor y podemos verificar la imagen listando las imágenes disponibles en docker.

docker images

REPOSITORY                 TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
vmcentos7x64-base          latest              5614f7ab3103        2 minutes ago       1.433 GB
ubuntu                     latest              d2a0ecffe6fa        10 weeks ago        188.4 MB
centos                     latest              7322fbe74aa5        3 months ago        172.2 MB

Revisamos la versión de nuestro contenedor visualizando por ejemplo la versión de centos del mismo.

docker run -i -t vmcentos7x64-base  cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core) 

Ya tenemos disponible un contenedor docker con una versión base de CentOS 7.1.1503. Para ello, bastará con arrancar una shell en el contenedor.

docker run -i -t vmcentos7x64-base  sh

Verificamos sobre la shell que estamos en un contenedor de mi host (en este caso Ubuntu 14.04LTS) comprobando el kernel arrancado.

sh-4.2# uname -a
Linux bd48dacb894f 3.16.0-48-generic #64~14.04.1-Ubuntu SMP Thu Aug 20 23:03:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux


viernes, 18 de septiembre de 2015

Creación de un sistema BASE (BOX) para VAGRANT

Creación de un sistema BASE (BOX) para VAGRANT

  • Ubuntu 14.04 x64
  • VirtualBox 5.0.2 + ExtensionPack
  • Vagrant 1.7.4
  • CentOS 7 x64  (llamaremos al nodo vmcentos7x64)

Antes de nada, comencemos por revisar por qué es necesario o conveniente la creación de una box base para vagrant con la cantidad de ellas que existen libres para descargar.
Personalmente me gusta poder configurar un sistema desde el inicio; una instalación mínima sobre la que poder construir sistemas con Vagrant o Puppet, con lo básico, evitando así incompatibilidades de orígenes, librerías, versiones, etc... Esto me garantiza que puedo recuperar los pasos exactos para una aplicación concreta, servicio, etc..., evitando tener paquetes y librerías ya instalados y pudiendo personalizar todos y cada uno de los componentes desde cero.

Para el ejemplo usaré un sistema CentOS 7 de 64 bits virtualizado con Virtualbox 5.02 y provisionado con Vagrant 1.7.4., sobre un sistema Ubuntu 14.04 LTS.

Lógicamente este procedimiento sería similar para cualquier host Linux y guest Linux, independientemente de la versión/flavour usada (salvo las instalaciones de paquetes...).

Comenzamos creando en virtualbox una máquina virtual CentOS 7.
Usando la línea de comandos y teniendo descargada la ISO del sistema operativo mínimo (CentOS-7.0-1406-x86_64-Minimal.iso), realizaremos los siguientes pasos:


Creamos la nueva máquina base en VirtualBox.

VBoxManage createvm --name vmcentos7x64 --ostype RedHat_64 --register

Añadimos memoria, por ejemplo 1GB.

VBoxManage modifyvm vmcentos7x64 --memory 1024

Añadimos un interface de red con NAT.

VBoxManage modifyvm vmcentos7x64 --nic1 nat 

Añadimos una redirección de puertos para poder conectarnos localmente (en Vagrant por defecto usamos el puerto 2222).

VBoxManage modifyvm vmcentos7x64 --natpf1 ssh_2222,tcp,,2222,,22

Creamos un fichero de disco virtual de 8000MB en formato VMDK.

VBoxManage createhd --filename <PATH_REPOSITORIO_DISCOS_VIRTUALES>/vmcentos7x64.vmdk --size 8000 --format VMDK


Añadimos un controlador SATA

VBoxManage storagectl vmcentos6_i386 --name "SATA Controller" --add sata --controller IntelAhci

Añadimos el disco a la máquina virtual en el controlador SATA creado.

VBoxManage storageattach vmcentos7x64 --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium <PATH_REPOSITORIO_DISCOS_VIRTUALES>/vmcentos7x64.vmdk

Añadimos un controlador IDE para el CDROM (podríamos haber configurado la unidad en el SATA también).

VBoxManage storagectl vmcentos7x64 --name "IDE Controller" --add ide --controller PIIX4

Añadimos la ISO sobre el controlador para que la monte la máquina virtual.

VBoxManage storageattach vmcentos7x64 --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium <PATH_REPOSITORIO_ISOS>/CentOS-7-x86_64-Minimal-1503-01.iso

Habilitamos el acceso remoto por RDP.

VBoxManage modifyvm vmcentos7x64 --vrde on

Configuramos el puerto y el tipo de acceso.

VBoxManage modifyvm vmcentos7x64 --vrdemulticon on --vrdeport 8998

Por último arrancamos la máquina virtual para realizar la instalación

VBoxHeadless --startvm vmcentos7x64


Ahora podemos conectarnos al servidor con cualquier cliente RDP usando el puerto 8998.

En mi caso, usando directamente rdesktop (toda la creación de la máquina virtual podría haberse realizado sin problemas en un servidor remoto por lo que lógicamente nos conectaríamos mediante RDP al este, usando el puerto indicado). 

rdesktop localhost:8998

Instalamos el sistema operativo y actualizamos convenientemente…
Realizamos un reinicio para arrancar con el kermel más reciente (esto es totalmente opcional, pero será necesario tenerlo en cuenta para las fuentes a instalar para compilar las tools de Virtualbox).
Instalamos también lo esencial para poder compilar las tools de Virtualbox.

yum groupinstall "Development Tools"

yum install kernel-devel kernel-headers


OJO, tras haber reiniciado y actualizado, las fuentes serán las correctas para el kernel arrancado si no especificamos la versión...

Instalamos wget para poder descargar posteriormente las claves “inseguras” de vagrant. Las denominamos "inseguras" porque lo son, son las claves "por defecto" que usará Vagrant en la conexión, y son lógicamente comunes a todas las máquinas virtuales publicadas por defecto. Veremos próximamente cómo poder usar nuestras propias claves y securizar las máquinas creadas de esta forma en otra entrada del blog.

yum install -y wget

Continuamos configurando la máquina virtual, de forma muy básica; ya que necesitamos un servidor con lo mínimo para poder provisionar posteriormente los paquetes necesarios para nuestro aplicativo concreto.

Configuramos el arranque automático de sshd 

systemctl enable sshd.service

Configuramos el usuario vagrant

useradd -m vagrant

Configuramos el acceso del usuario vagrant con sudo. No realizamos ninguna modificación a las restricciones de terminal para ejecuciones remotas ya que es posible modificarlo posteriormente en Vagrant.

visudo -f /etc/sudoers.d/vagrant

vagrant ALL=(ALL) NOPASSWD:ALL


Creamos la configuración de claves descargando la clave insegura, pública, de vagrant.

mkdir -p /home/vagrant/.ssh

chmod 0700 /home/vagrant/.ssh


wget --no-check-certificate https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys


chmod 0600 /home/vagrant/.ssh/authorized_keys


chown -R vagrant /home/vagrant/.ssh


Instalamos las tools de Virtualbox añadiendo primero la ISO y posteriormente montando y ejecutando su instalador.

VBoxManage storageattach vmcentos7x64 --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium /usr/share/virtualbox/VBoxGuestAdditions.iso

mount /dev/cdrom /mnt

cd /mnt
sh VBoxLinuxAdditions.run

Podemos provisionar todas las herramientas que necesitemos en nuestra máquina/BOX base, pero siempre es conveniente provisionar con Vagrant o puppet el software a posteriori y tener esta máquina con lo mínimo extrictamente necesario. 

Siempre podemos actualizar este sistema base cuando se quede obsoleto.

Una vez que tenemos nuestro sistema preparado, ya podemos apagarlo para crear la máquina base para Vagrant, bien desde la conexión ssh o RDP que usamos durante la instalación o bien desde el propio Virtualbox usando 

VBoxManage controlvm vmcentos7x64 poweroff


Una vez tenemos la máquina base, comenzamos la creación en vagrant..

Creamos un sistema base, en nuestro caso, lo llamamos simplemente vmcentos7x64, y al fichero generado vmcentos7x64.box.

vagrant package --base vmcentos7x64 --output <REPOSITORIO_SISTEMAS_BASE_VAGRANT>/vmcentos7x64.box  

==> vmcentos7x64: Clearing any previously set forwarded ports...
==> vmcentos7x64: Exporting VM...
==> vmcentos7x64: Compressing package to: XXXXXXXXXXXX/vmcentos7x64.box

Añadimos ahora el sistema base los disponibles para ser usados en Vagrant.

vagrant box add --name vmcentos7x64 <REPOSITORIO_SISTEMAS_BASE_VAGRANT>/vmcentos7x64.box

==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'vmcentos7x64' (v0) for provider: 
    box: Unpacking necessary files from: file:///XXXXXXXXXXXXXXXXXX/vmcentos7x64.box
==> box: Successfully added box 'vmcentos7x64' (v0) for 'virtualbox'!

Ya estaría disponible el sistema base para poder ser usado para provisionar nuevos sistemas basados en él.

Probamos la máquina base creada.

Creamos un directorio repositorio para la nueva máquina de TEST e inicializamos la máquina

mkdir <VAGANT_REPO>/test

cd <VAGRANT_REPO>/test


vagrant init vmcentos7x64


Para evitar errores de acceso mediante ssh y posterior uso de sudo por el usuario vagrant sin terminal durante la provisión, editamos el fichero de configuración de vagrant, Vagrantfile para añadir la opción de tty para ssh; ya que no hemos especificado nada en el acceso sudoers referente a la necesidad o no de terminal en ejecuciones mediante ssh.
Simplemente añadimos al fichero la línea 

config.ssh.pty = true

Por último iniciamos la máquina como siempre con vagrant up y probamos la conexión con vagrant ssh.

Si todo ha ido bien, tendremos prompt con usuario vagrant.

vagrant ssh
Last login: XXXXXXXXXXXXX from XXXXXXXX
[vagrant@test ~]$ 

En una nueva entrada, configuraremos de forma segura una clave privada en lugar de usar la clave insegura, pública de Vagrant.

También veremos cómo provisionar nuevos interfaces de red para presentar el servidor provisionado al "mundo" , fuera del NAT sencillo que usamos para su inicialización. Para ello realizaremos configuraciones ya sobre su provisión con Vagrant.

Espero que el procedimiento os sirva de ayuda al menos tanto como para mí escribirlo y así recordarlo :P ...