Docker: Dockerfiles creando imagenes

Fuente :  http://www.blog.teraswap.com.ar/docker-dockerfiles-imagenes/

Muchas veces cuando trabajamos con Docker tenemos que crear imágenes que se componen de varios comandos de Docker o partes de otras imágenes y quizás hasta copiar algún directorio local dentro de la imagen. Para este tipo de situaciones como también para el caso de que no se quiera subir una imagen que tenga un tamaño muy grande es que existen los Dockerfiles.

¿Que es un Dockerfile?

Dockerfile es una secuencia de comandos (instrucciones) que por medio de una imagen base nos permiten realizar las modificaciones y obtener una nueva, se utilizan para organizar las cosas y ayudan en gran medida con las implementaciones. Algunas de las ventajas como se mencionaron anteriormente son que no es necesario subir una imagen de gran volumen a algún repositorio sino basta con subir el archivo que en su interior es un archivo de texto con instrucciones Docker.
Para poder crear un Dockerfile no hace falta nada mas que un editor de texto y saber de antemano la sintaxis de los comandos, por el contrario para poder compilarla (hacer un build de la misma) hace falta tener instalado en la maquina Docker. Un dato no menor es que el nombre del archivo donde se coloquen los comandos se debe llamar Dockerfile y no poseer extensión alguna.




¿Cuales son los comandos mas comunes?

Los comandos que se pueden ejecutar dentro de un Dockerfile son de los mas variados pero los mas comunes son los siguientes:
  • FROM: Este es el comando mas importante dentro de un Dockerfile ya que es el que indica cual es la imagen base que tomamos para crear una nueva.
FROM ubuntu:12.04
  • ADD: Por medio de este comando podemos copiar archivos dentro de nuestra nueva imagen ya sea desde una URL o desde una carpeta fisica que se encuentre en nuestra maquina host. Algo que cabe la pena resaltar es que las carpetas que se quieran copiar deben estar a la misma altura en el filesystem que el Dockerfile sino lo encontrara dentro de su contexto y nos arrojara un error.
ADD /entorno/jbosss  /entorno/jboss
  • RUN: Con este comando podremos ejecutar todo tipo de tareas que serán ejecutadas una vez que se descargue la imagen base. Ejemplo de este comando podrían ser: crear una carpeta, actualizar el repositorio de alguna de las distribuciones de Linux o instalar alguna aplicación.
RUN apt-get update
RUN mkdir test
  • CMD: Este comando es similar al comando RUN con la única diferencia que este no se ejecuta durante la fase de compilación (build) sino que se ejecuta cuando iniciamos el contenedor.
CMD "echo" "Hola"
  • EXPOSE: Por medio de este comando podremos exponer un puerto de la imagen hacia la maquina host. Esto es una buena opción por ejemplo cuando tenemos un servidor o una base de datos que se inicia apenas se crea un contenedor.
EXPOSE 80
  • ENTRYPOINT: Este comando indica que es lo que se ejecutara cada vez que se crea un contenedor, por ejemplo si lo que se quiere es que cada vez que se crea un contenedor se inicie un servidor (Apache, Ngnix o una base de datos) deberemos indicar cual es el comando que se encarga de iniciarlo.
ENTRYPOINT ["/usr/sbin/nginx"]
  • ENV: Por medio de este comando seteamos las variables de entorno que serán validas dentro de esta imagen.
ENV LANGUAGE en_US.UTF-8
  • MAINTAINER: Este si bien no es un comando indica quien es el autor y quien se encarga de mantener el Dockerfile. Si bien no hay ninguna limitacion de donde colocar esto  se estila hacerlo luego del comando FROM.
MAINTAINER teraswap teraswap
  • VOLUME: Nos permite montar una carpeta de nuestra maquina host dentro de nuestra imagen. Se debe tener particular atención a que la carpeta sea algo que pueda existir en todas las maquinas donde se compile el Dockerfile ya que sino nos arrojara un error
VOLUME ["/var/www"]
  • WORKDIR: Este comando nos permitirá indicarle a Docker cual es el directorio por default donde ejecutara las acciones.
WORKDIR /var/www

Un ejemplo concreto

Con el fin de poder entender como seria un Dockerfile a continuación se mostrara como crear una imagen nueva que apenas se cree un contenedor inicie MongoDB (para los que no lo conocen, MongoDB es una base de datos no relacional).


# Colocamos la imagen base
FROM ubuntu

# Declaramos quien es el autor y el que se encagara de mantenerla
MAINTAINER jose perez

# Actualizamos los repositorios de Ubuntu
RUN apt-get update

# Instalamos el paquete de MongoDB
RUN apt-get install -y mongodb

# Creamos el directorio donde se alojara todo la informacion
RUN mkdir -p /data/db

# Exponemos el puerto por default de Mongo
EXPOSE 27017

# Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"]

# Seteamos cual es el punto de inicio
ENTRYPOINT usr/bin/mongod

¿Cómo compilo la imagen?

Para poder crear la imagen a partir de un Dockerfile necesitamos estar posicionados en la terminal en el mismo directorio donde se encuentra el archivo en cuestión (ademas de tener instalado de antemano Docker)  y ejecutar el siguiente comando:

docker build -t nombreImagen:nombreTag

ejemplo:

#docker build -t jose/ubuntu:apache  .

Ojo que el punto al final es necesario..


Lo que hara Docker es ejecutar cada uno de los comandos que se encuentren en el archivo y una vez que termine lo hara un tag poniéndole el nombre a la imagen y el tag que se definió (internamente lo hace es terminar de ejecutar todo y hacer un docker tag nombreImagen:nombreTag).

Luego para iniciar la imagen seria:

#docker run -i -t jose/ubuntu:apache /bin/bash

Comentarios