Antes de empezar
Antes de empezar debemos editar el ficher /etc/default/docker y añadir nuestros servidores de dns como se indica en la siguiente imagen.

Debemos reiniciar docker con
sudo service docker restart
Introducción
Para poder construir imagenes crearemos un Dockerfile con el que podremos:
- Espcificar una imagen base
- Ejecutar algunos comandos para instalaciones adicionales
- Especificar un comando para ejecutar al arranque del contenedor
Construyendo un Dockerfile
Crearemos una imagen que ejecute un servidor de redis.
Primero creamos un directorio mkdir redis-server, entramos en el cd redis-server y abrimos visual studio ejectuando el comando code .

Una vez abierto visual studio code pasaremos a crear el fichero Dockerfile

Los comentarios indican lo que se va a hacer a cada paso, y a continuación podéis ver el contenido de las instrucciones

Ahora solamente tenemos que construir la imagen, para ello usaremos el terminal que nos ofrece visual studio code para ejecutar el comando:
docker build . (no olvidar punto final)

En este caso vemos en el último mensaje la id de nuestro contenedor, y como hemos visto en el primer tutorial debemos usar esta id para ejectuar el contendor.

Para parar usamos Ctrl+C
Explicación comandos
FROM alpine : indica la imagen base a descargar, si queremos usar debian podríamos FROM debian
RUN apk add –update redis : en este caso indica a la imagen que actualice los paquetes e instale el servidro redis
CMD [«redis-server»] : indica que comando ejecutar una vez se inicie el contenedor
Que es una imagen base?
Escribir un dockerfile es como iniciar un ordenador sin sistema operativo e ir indicándole que pasos debe hacer para instalar un programa, como por ejemplo google chrome.
Para este ejemplo concreto lo que haríamos seria:
- Instalar un sistema operativo
- Abrir el navegador que viene por defecto
- Navegar hasta la web google.com
- Descargar el instalador de chrome
- Abrir el navegador de archivos
- Ejecutar el instalador de chorme
- Ejecutuar chrome
Estos serían los pasos que se indicarían en la receta para instalar chrome.
Es muy similar a lo que hemos hecho con nuestro dockerfile:
- Elegir una imagen base (FROM alpine)
- Instalar programas y dependencias (RUN apk add –update redis)
- Ejecutar programas (CMD [«redis-server»]
Porqué alpine
Utilizamos alpine como imagen base ya que es una distribución linux que se adapta a nuestras necesidades en este caso, del mismo modo que un usuari elige usar Windows, linux o macOS
En este caso es muy fácil instalar redis en alpine con el comando apk add –update redis
Que hace docker build .
Esta instrucción indica a docker que debe construir una imagen a partir de un fichero de configuración des del directorio donde nos encontramos, por eso el punto (.) (contexto)
El contexto es el conjunto de ficheros y carpetas que contendrán la iformación necesaria para construir la imagen que usaremos para crear nuestros contenedores.
En nuestro caso la salida del comando docker build . nos da lo siguiente
Step 1/3 : FROM alpine
---> 14119a10abf4
Step 2/3 : RUN apk add --update redis
---> Using cache
---> 092f34ede7a1
Step 3/3 : CMD [ "redis-server" ]
---> Using cache
---> 55e275efe6ae
Successfully built 55e275efe6ae
Cada paso (step) hace referencia a una instrucción del dockerfile, en este caso los pasos utilitzan la cache ya que no hemos realizado cambios en el dockerfile.
En cada paso intermedio se utiliza una id que representa un contenedor temporal que se guarda para el siguiente paso, se realiza un snapshot para seguir con el proceso.
En el último paso tenemos una imagen modificada con todos los pasos anteriores y con un comando a punto de ejectuar.
Como se comporta la cache.
En el ejemplo anterior hemos visto que se usaba la cache ya que hemos mostrado una segunda ejecución del comando build.
Si ahora modificamos el dockerfile para instalar otra dependencia, por ejemplo gcc, quedaría como sigue:

Al ejectuar ahora docker build, en el paso 3 y siguientes ya no se usa la cache al ser una instrucción nueva

Esto modifica los contenedores intermedios y se construyen de nuevos
En los pasos 1 y 2 se sigue usando la cache ya que no ha habido cambios.
Si ahora ejecutamos de nuevo docker build . veremos que todos los pasos están en cache

Mejor poner los cambios lo más abajo posible para evitar tener que reconstruir toda la imagen
Etiquetar imagenes
Para ejectuar una imagen debemos usar docker run <id-de-la-imagen>
En el caso anterior sería docker run e200d85efe4a

Para no tener que estar recordando número en hexadecimal largos lo que podemos hacer es etiquetar una imagen cuando la construyamos.
La convención para etiquetar una imagen es la siguiente
enguillem/redis:latest (lo primero es nuestra id de docker la obtenmos de https://hub.docker.com/) el nombre del proyecto en este caso redis y la versión, podemos latest en este caso, auque podríamos poder un número.
La instrucción para construir una imagen etiquetada sería:
docker build -t enguillem/redis:latest . (no olvidar el punto)

Ahora podemos ejecutar un contenedor usando el nombre de la imagen:
