Construyendo imágenes con docker build

El comando docker build construye la nueva imagen leyendo las instrucciones del fichero Dockerfile y la información de un entorno, que para nosotros va a ser un directorio (aunque también podemos guardar información, por ejemplo, en un repositorio git).

La creación de la imagen es ejecutada por el docker engine, que recibe toda la información del entorno, por lo tanto es recomendable guardar el Dockerfile en un directorio vacío y añadir los ficheros necesarios para la creación de la imagen. El comando docker build ejecuta las instrucciones de un Dockerfile línea por línea y va mostrando los resultados en pantalla.

Tenemos que tener en cuenta que cada instrucción ejecutada crea una imagen intermedia, una vez finalizada la construcción de la imagen nos devuelve su id. Algunas imágenes intermedias se guardan en caché, otras se borran. Por lo tanto, si por ejemplo, en un comando ejecutamos cd /scripts/ y en otra linea le mandamos a ejecutar un script (./install.sh) no va a funcionar, ya que ha lanzado otra imagen intermedia. Teniendo esto en cuenta, la manera correcta de hacerlo sería:

cd /scripts/;./install.sh

Para terminar indicar que la creación de imágenes intermedias generadas por la ejecución de cada instrucción del Dockerfile, es un mecanismo de caché, es decir, si en algún momento falla la creación de la imagen, al corregir el Dockerfile y volver a construir la imagen, los pasos que habían funcionado anteriormente no se repiten ya que tenemos a nuestra disposición las imágenes intermedias, y el proceso continúa por la instrucción que causó el fallo.

Ejemplo de Dockerfile

Vamos a crear una imagen con ubuntu, al cuál le vamos a instalar apache y vamos a poner una web (index.html) con nuestro nombre.
Para ellos creamos un directorio en nuestro pc llamado miprimerdockerfile, en ese directorio colocaremos el fichero index.html y crearemos un fichero llamado Dockerfile

El contenido de Dockerfile será:

FROM ubuntu:latest
MAINTAINER Paco Maño "fj.manofrasquet@edu.gva.es"
RUN apt update  && apt install -y  apache2 
COPY index.html /var/www/html/
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Para crear la imagen uso el comando docker build, indicando el nombre de la nueva imagen (opción -t) y indicando el directorio contexto.

$ docker build -t framafra/ubuntuapache:v1 .

Nota: Ponemos como directorio el . porque estamos ejecutando esta instrucción dentro del directorio donde está el Dockerfile. A la imagen que voy a crear la llamos framafra/ubuntuapache y le pongo el tag de v1

Una vez terminado, podríamos ver que hemos generado una nueva imagen:

$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
framafra/ubuntuapache       v1                4816f9eee434        11 seconds ago      225MB
...

Ahora podemos crear el contendor a partir de la imagen creada, ejecutando el siguiente comando:

$ docker run -d -p 8080:80 --name web_server framafra/ubuntuapache:v1