Creando imágenes de contenedores a partir de un Dockerfile
Docker puede construir imágenes de forma automática a partir de instrucciones definidas en un archivo especial llamado Dockerfile. Este archivo es un documento que contiene todos los comandos que un usuario puede hacer desde una terminal para ensamblar la imagen. La ventaja de crear imágenes de esta forma es que permite elegir los paquetes a instalar, las versiones a utilizar y consecuentemente actualizar el sistema a medida pasa el tiempo.

Laboratorio: Creando imágenes de contenedores a partir de un Dockerfile
Descripción
La presente guía describe los pasos a realizar para construir una imagen de contenedor desde un Dockerfile.
Objetivo
- Construir una imagen desde un Dockerfile
Antes de comenzar
- Contar con el acceso al ambiente de laboratorio
Inicio de laboratorio
-
Ingresar al servidor qué contiene al ambiente de laboratorio con credenciales proporcionadas
-
Crear directorio
mkdir web-app -
Acceder al directorio web-app
cd web-app -
Crear directorio src
mkdir src -
Crear archivo index.html
echo "<p style=\"color:red; font-size:100px\">Imagen creada desde un Dockerfile</p>" > src/index.html -
Crear archivo Dockerfile
vi Dockerfile -
Agregar comentario
# Este comentario es ignorado, pero es útil para describir instrucciones -
Agregar nombre de imagen a utilizar, especificando la etiqueta/tag
`15.3FROM opensuse/leap:15.3 -
Agregar una etiqueta con alguna descripción de la imagen
LABEL description="Servicio de nginx en imagen opensuse" -
Agregar datos del usuario que mantiene la imagen
LABEL maintainer="John Doe <jdoe@xyz.com>" -
Agregar ARG, la variable PORT, estará disponible durante el proeso de creación, pero no en el contenedor creado a partir de la imágen.
ARG PORT=80 -
Instalar nginx sin interacción de usuario por medio de la opción -n y limpiar cache
RUN zypper -n install nginx && \ zypper clean --all -
Exponer puerto $PORT
EXPOSE $PORT -
Copiar archivo index.html
COPY ./src/index.html /srv/www/htdocs/index.html -
Crear variable con url de imagen para mostrar en página html
ENV URL_IMAGE="https://bit.ly/3K6mGZY" -
Agregar url de imagen al página html
RUN echo "<img src=${URL_IMAGE}>" >> /srv/www/htdocs/index.html -
Agregar volumen almacenar de forma persiste alguna información, es una referencia para los usuarios de la imágen, de qué podría ser persistente.
VOLUME /downloads -
Indicar instrucción para ejecución de nginx en foreground
CMD ["nginx", "-g", "daemon off;"] -
El archivo Dockerfile debería de ser como el siguiente
1 2 3 4 5 6 7 8 9 10 11 12 13
# Este comentario es ignorado, pero es útil para describir instrucciones FROM opensuse/leap:15.3 LABEL description="Servicio de nginx en imagen opensuse" LABEL maintainer="John Doe <jdoe@xyz.com>" RUN zypper -n install nginx && \ zypper clean --all ARG PORT=80 EXPOSE $PORT COPY ./src/index.html /srv/www/htdocs/index.html ENV URL_IMAGE="https://bit.ly/3K6mGZY" RUN echo "<img src=${URL_IMAGE}>" >> /srv/www/htdocs/index.html VOLUME /downloads CMD ["nginx", "-g", "daemon off;"] -
Construir imagen a partir de Dockerfile
docker build -t opensuse-nginx . -
Verificar que se haya creado la imagen de contenedor llamada opensuse-nginx
docker images -
Verificar toda la información disponible sobre la imagen creada
docker inspect opensuse-nginx:latestdocker history opensuse-nginx:latest -
Crear directorio para volumen persistente para almacenar logs
mkdir downloads -
Ejecutar contenedor a partir de la imagen creada, agregando el volumen del directorio downloads al directorio /downloads con fines de prueba y el puerto 30080 del equipo host al puerto 80 del contenedor
docker run -d --name nginx -v $PWD/downloads:/downloads -p 30080:80 opensuse-nginx -
Verificar estado del contenedor
docker ps -
Desde su navegador de Internet acceda a su HOST de Prueba, acceder en varias ocasiones para generación de logs.
Acceda a este URL, via su browser o via linea de comandoHOST_EXTERNAL_IP=$(curl -s http://showip.net) echo http://${HOST_EXTERNAL_IP}:30080 -
Mostrar logs del contenedor
Los logs están vacíos, esto es debido a la configuración por defecto del APP que aún apunta al sistema de archivos.docker logs nginx -
Verificar que los logs se encuentren en el directorio del contenedor
docker exec -it nginx bash -c 'tail /var/log/nginx/access.log' -
Detenga el contenedor y elimine el contenedor
docker stop nginxdocker rm nginx -
Modifique su archivo Dockerfile y agregue la siguiente linea:
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log -
El archivo Dockerfile debería de ser como el siguiente
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# Este comentario es ignorado, pero es útil para describir instrucciones FROM opensuse/leap:15.3 LABEL description="Servicio de nginx en imagen opensuse" LABEL maintainer="John Doe <jdoe@xyz.com>" RUN zypper -n install nginx && \ zypper clean --all ARG PORT=80 EXPOSE $PORT COPY ./src/index.html /srv/www/htdocs/index.html ENV URL_IMAGE="https://bit.ly/3K6mGZY" RUN echo "<img src=${URL_IMAGE}>" >> /srv/www/htdocs/index.html RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log VOLUME /downloads CMD ["nginx", "-g", "daemon off;"] -
Construya nuevamente la imágen del contenedor
docker build -t opensuse-nginx . -
Ejecute de nuevo el contenedor
docker run -d --name nginx -v $PWD/downloads:/downloads -p 30080:80 opensuse-nginx -
Acceda nuevamente desde su navegador o refresque la página, acceder en varias ocasiones para generación de logs.
HOST_EXTERNAL_IP=$(curl -s http://showip.net) echo http://${HOST_EXTERNAL_IP}:30080 -
Mostrar logs del contenedor
Los logs deberían de mostrarse en la salida del comando. Existen otras prácticas sugeridas para la construcción de imágenes que se revisarán posteriormente.docker logs nginx
Limpieza de ambiente
Detener y borrar contenedor
docker rm -f nginx
Eliminar la imágen de contenedor creada
docker rmi opensuse-nginx
Eliminar el directorio de trabajo
cd ~/ && rm -fR ~/web-app