Para hablar de Docker sin entrar demasiado en detalles, es solución a mitad de camino entre usar el sistema local y utilizar un sistema virtualizado, tiene las ventajas de ambos mundos y algunas más: como poder conectar un “contenedor” a una “bahía” y que este empiece a funcionar así sin más, logrando un encapsulamiento de toda una infraestructura sin necesidad de virtualizar toda una maquina virtual. Abstracción y automatización son las virtudes que más definen esta solución. Para lograrlo Docker hace uso de cgroups y namespaces nativos del núcleo linux permitiendo que distintos contenedores se ejecuten sobre un solo sistema operativo.

Instalando Docker

En este tutorial vamos a usar un Ubuntu como el sistema base, supongo que los usuarios más noveles lo agradecerán. Para ello instalaremos el siguiente programa para gestionar claves GPG:

sudo apt-get install apt-transport-https ca-certificates

Añadimos la clave GPG:

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Editamos el siguiente archivo:

sudo nano /etc/apt/sources.list.d/docker.list

Agregando la siguiente linea:

deb https://apt.dockerproject.org/repo ubuntu-xenial main

Actualizamos repositorios:

sudo apt update

Ahora instalamos Docker en nuestro sistema:

sudo apt install docker.io

Reiniciamos Docker:

sudo systemctl restart docker

Nos agregamos como Usuario de Docker:

sudo usermod -a -G docker muylinux
newgrp docker

¡Listo! Ya tenemos Docker funcionando en nuestro sistema.

Administración básica de Docker

Administración de Imágenes

Docker utiliza un sistema de imágenes y de contenedores. Las imágenes son sistemas estáticos a los que no podemos acceder o modificar, sirven para crear contenedores de ellas.

  • Listar imágenes disponibles para instalar:
    docker search *
  • Instalar una imagen:
    docker pull *
  • Listar todos los imágenes descargados:
    docker images
  • Crear un contenedor de una imagen (no se debe confundir con ejecutar un contenedor)
    docker run -i -t [IMAGE ID] /bin/bash

    o

    docker run -i -t [TAG] /bin/bash
  • Crear un TAG para una imagen
    docker tag [IMAGE ID] oldlts:[NUEVO TAG]
  • Borrar una imagen
    docker rmi [IMAGE ID]

Administración de contenedores

Para salir de un contenedor sin detener la ejecución del contenedor pulsamos CTRL + P + Q, para detenerlo CTRL + D.

  • Para listar los contenedores disponibles
    docker ps -a
  • Para cambiar un nombre a un contenedor
    docker rename [CONTAINDER ID] [NEW_NAME]

    o

    docker rename [NAMES] [NEW_NAME]
  • Para ejecutar un contenedor
    docker start [CONTAINDER ID]

    o

    docker start [NAMES]
  • Para acceder a un contenedor en ejecución, ya que por defecto lo ejecuta sin acceder.
    docker attach [CONTAINDER ID]

    o

    docker attach [NAMES]
  • Para detener un contenedor en ejecución
    docker stop [CONTAINDER ID]

    o

    docker stop [NAMES]
  • Crear una imagen a partir de un contenedor, muy útil para clonar entornos de ejecución listos para el desarrollo o para soluciones listas para desplegar.
    Docker commit [CONTAINDER ID] [TAG]
  • Borrando contenedores:
    docker rm [CONTAINDER ID]

    o

    docker rm [NAMES]

LAMP en Docker

En este pequeño sub-tutorial de Docker, vamos a instalar una infraestructura típica Linux para desarrollo, sobre una imagen de Ubuntu instalaremos herramientas de red de Linux, un servidor apache, MySQL, PHP 7, PHPMyAdmin, y crearemos una carpeta compartida para alojar nuestro proyecto, ¡Manos a la obra!

  • Lo primero sera instalar una imagen de Ubuntu:
    docker pull ubuntu
  • Creamos un contenedor
    docker run -i -t ubuntu /bin/bash
  • Actualizamos servidores para poder realizar instalaciones
    apt update
  • Instalamos un paquete de red mínimo y algunas utilidades:
    apt install net-tools dialog nano
  • Instalamos LAMP + PHPMyAdmin
    apt  install lamp-server^ phpmyadmin
  • Cuando nos pregunta si queremos configurar automáticamente PHPMyAdmin elegimos no (nos sera imposible hacer uso del servidor automático por que por defecto Apache y MySQL en la imagen de Docker deben ser iniciados primeramente). Editamos el archivo de configuración de apache para darle permisos a PHPMyAdmin

    nano /etc/apache2/apache2.conf

    Incluyendo la siguiente linea al final del archivo

    Include /etc/phpmyadmin/apache.conf
  • Iniciamos el Apache y MySQL (cada vez que iniciemos el contenedor sera necesario hacerlo)
    /etc/init.d/apache2 restart
    /etc/init.d/mysql start

    Con esto deberíamos tener todo funcionando, averiguamos si el servidor esta funcionando, para ello descubrimos la IP de nuestro contenedor usando:

    ifconfig

    Y por ultimo necesitamos crear el usuario www-data y el usuario mysql para ello hacemos uso del siguiente comando:

    usermod -u 1000 www-data
    usermod -G staff www-data
    usermod -d /var/lib/mysql/ mysql

    Ahora podemos crear una imagen desde este contenedor así tendremos disponible un contenedor LAMP cada vez que queramos crear un nuevo desarrollo.

    docker commit ubuntuLamp ulamp

Carpetas compartidas entre Docker y el sistema HOST

Por ejemplo si queremos crear un contenedor nuevo con una carpeta compartida, lo podemos hacer directamente usando la imagen de nuestro contenedor con LAMP ya preparado. Para ello debemos ejecutar:

docker run -v $PWD/proyectFolder:/var/www/html/ -it ulamp /bin/bash

Donde:

  • -v es la opción para compartir datos entre el sistema HOST y el contenedor
  • $PWD es una variable Bash que contiene la ruta con la carpeta home del usuarios
  • /proyectFolder una carpeta cualquiera que contiene nuestra aplicación web
  • :/var/www/html/ la carpeta de destino de dentro del contenedor LAMP
  • -it ulamp es el nombre de la imagen con Ubuntu LAMP que configuramos anteriormente

Si están usando algún tipo de protección SElinux en el HOST Docker el compartir carpetas con contenedores Docker les va a tirar un error fatal. Recomiendo lo siguiente:

docker run --privileged=true -v $PWD/data1:/opt/data1 -it debian /bin/bash

¿Como te ha resultado? ¿Sencillo? Una vez que te acostumbras te aseguro que no quieres volver a usar una maquina virtual en tu vida. Saludos y hasta el próximo tutorial. Para lograrlo Docker hace uso de cgroups y namespaces nativos del núcleo linux permitiendo que distintos contenedores se ejecuten sobre un solo sistema operativo.