El siguiente nivel de Docker es Atomic

Los contenedores son una interesante forma de distribuir aplicaciones y plataforma pero cuando hay aplicaciones que requieren de varias partes, como servidor web, base de datos, etc. todos ellos en contenedores diferentes, esto puede ser una tarea colosal. Son muchos contenedores que deben presentarse unos a otros con puertos especificos de cada uno y variables de acceso, etc, y hacer todo esto de forma manual puede ser una tarea de adminstración muy compleja.

Para estos casos el proyecto atomic juega un rol muy importante. Es un conjunto de herramientas que permiten presentar aplicaciones con sus diferentes contenedores ya todos integrados de acuerdo a reglas definidas.

La guia de inicio del proyecto es bastante sencilla de seguir y una vez funcionando el cluster de servidores es bastante sencillo de desplegar aplicaciones, aunque sigue siendo bastante manual porque se basa en archivos de texto, al igual que los Dockerfile de los contenedores, con las configuraciones para deplegar los “pods” (conjunto de contenedores vinculados), y luego el aplicar los mismos al cluster tambien es manual, a los sumo se puede automatizar un poco. Podemos decir que atomic presenta un lenguaje para juntar especificaciones de cada contenedor y desplegar los contenedores ya todos vinculados.

Creo que en el futuro, nos presentaran una herramienta de gestión de los “pods” más visual, pero por ahora, permite una administración muy fácil de algo que puede volverse engorroso con el tiempo.

Nota al margen: el cluster de atomic, no tiene una seguridad muy elaborada entre servidores y clientes, me supongo que es porque se espera que corra en un “ambiente aislado y seguro”.

Creando imagenes en docker

En esta entrega trabajaremos con crear una imagen con nuestras configuraciones y publicarla para que otros puedan usarla en sus proyectos.

Empecemos descargando una imagen como base para nuestro trabajo.

docker pull fedora:latest

Para este ejemplo he creado un repositorio con los archivos usados, en este caso es simplemente un archivo PHP que contiene una función básica.

Crearé una imagen de Fedora 23 con el servidor Apache instalado y configurado para usar PHP. Este servidor luego mostrará una página con toda la informacón del ambiente PHP.

Primero creamos un directorio de trabajo, luego crearé un archivo llamado Dockerfile en el mismo.

mkdir fedora-test
touch fedora-test/Dockerfile

En este mismo directorio crearé un archivo, llamado archivo.php, cuyo contenido será el siguiente:

 <?php
phpinfo();
?>

Esto será para un ejemplo que usaremos mas adelante.

El archivo Dockerfile es el que define las acciones a realizar para obtener la imagen y se ejecuta de la siguiente forma:

cd fedora-test
docker build -t docker.io/rodolfoarce/fedora-test:0.1 .

El parametro -t docker.io/rodolfoarce/fedora-test:1.0 es para identificar la imagen con una etiqueta, así luego podremos publicar esta imagen con una etiqueta especifica en los repositorios publicos.

La clave de la construccion de la imagen es el archivo Dockerfile, que contiene todas las instrucciones para crear la imagen en cuestión.

Editamos el archivo Dockerfile, para que contenga las siguientes lineas, las explicaré por partes, y el archivo final deberá ser como este: click aquí

FROM fedora:latest

MAINTAINER Rodolfo Arce <mail@ejemplo.com>

La primera linea indica la instrucción FROM, que es la imagen original desde donde partiremos, en este caso yo parto desde fedora en su última version. Luego se indica la instrucción MAINTAINER quien es el que crea o mantiene esta imagen.

Acá empieza la parte divertida, esta imagen deberá ser modificada a través de varias tareas. Cada una de estas tareas, o conjunto de tareas se reaizan usando la instrucción RUN y a partir de ahí suceden los cambios

RUN dnf -y install httpd php && dnf clean all

Estos comandos instalan el serviro Apache y las librerías de PHP. Observación: Los comandos que fueras a realizar NO son interactivos, deben ser automáticos, por eso en se ejecutó con el parametro correspondiente dnf -y

Luego borro la cache de archivos descargados y los metadatos, esto es una buena practica para mantener las imagenes limpias y compactas en tamaño.

Hasta ahora el sistema es capaz de ejecutar el servidor web, pero yo quiero una pagina web en específico que sea mostrada. Existen dos formas de hacer esto, voy a ponerlas ambas a continuación, pero en el archivo mantendré la forma mas amigable con otros usuarios.

Primera forma:

Copiarla desde el directorio de trabajo, para esto se usa la instrucción COPY

COPY archivo.php /var/www/html/info.php && chown apache:apache /var/www/html/info.php

De esta forma yo estoy copiando archivo.php de mi directorio actual, al sistema de archivos de la imagen a ser creada y cambiando el usuario dueño del mismo.

La otra forma es descargar en vivo el archivo desde algún repositorio público legible por los nuevos usuarios.

RUN curl -L -s https://github.com/rodolfoarces/docker-test/raw/master/archivo.php -o /var/www/html/info.php && chown apache:apache /var/www/html/info.php

Esto es mas amigable porque otras personas podrán ver el contenido del archivo en vez de recibir una caja negra que no saben lo que hace.

Finalmente vienen tres instrucciones que van mas o menos de la mano:

EXPOSE 80

CMD ["-D", "FOREGROUND"]

ENTRYPOINT ["/usr/sbin/httpd"]

La instrucción EXPOSE indica que puerto deberá abrirse en comunicación con el exterior, la siguiente instrucción CMD indica parametros que deberán pasarse al ejecutable inicial ENTRYPOINT de la imagen, en este caso es el servidor httpd.

Si yo fuera a crear una imagen de otro servicio o ejecutable que escuche en otro puerto, deberé cambiar la instrucción EXPOSE, si este ejecutable no requiera de parametros de inicio, la instrucción CMD es innecesaria.

Para ejecutar esta imagen inicializamos un contenedor usando el siguiente comando:

docker run -d --name=test -p 80:80 rodolfoarce/fedora-test:0.1

Apuntamos nuestro navegador a la IP del servidor en cuestión y debería de mostra la información del ambiente.

En mi caso puedo observar esta información: Apache/2.4.18 (Fedora) PHP/5.6.17

Ahora para publica esta nueva imagen, la envío a los un repositorio fedora-test previamente creado en mi cuenta de docker hub.

docker push docker.io/rodolfoarce/fedora-test

Seguimos luego con otras entregas de mas funcionalidades de Docker