Skip to content

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.

Dockerfile

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

  1. Ingresar al servidor qué contiene al ambiente de laboratorio con credenciales proporcionadas

  2. Crear directorio

    mkdir web-app
    

  3. Acceder al directorio web-app

    cd web-app
    

  4. Crear directorio src

    mkdir src
    

  5. Crear archivo index.html

    echo "<p style=\"color:red; font-size:100px\">Imagen creada desde un Dockerfile</p>" > src/index.html
    

  6. Crear archivo Dockerfile

    vi Dockerfile
    

  7. Agregar comentario

    # Este comentario es ignorado, pero es útil para describir instrucciones
    

  8. Agregar nombre de imagen a utilizar, especificando la etiqueta/tag `15.3

    FROM opensuse/leap:15.3
    

  9. Agregar una etiqueta con alguna descripción de la imagen

    LABEL description="Servicio de nginx en imagen opensuse"
    

  10. Agregar datos del usuario que mantiene la imagen

    LABEL maintainer="John Doe <jdoe@xyz.com>"
    

  11. 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
    

  12. 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
    

  13. Exponer puerto $PORT

    EXPOSE $PORT 
    

  14. Copiar archivo index.html

    COPY ./src/index.html /srv/www/htdocs/index.html
    

  15. Crear variable con url de imagen para mostrar en página html

    ENV URL_IMAGE="https://bit.ly/3K6mGZY"
    

  16. Agregar url de imagen al página html

    RUN echo "<img src=${URL_IMAGE}>" >> /srv/www/htdocs/index.html
    

  17. 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
    

  18. Indicar instrucción para ejecución de nginx en foreground

    CMD ["nginx", "-g", "daemon off;"]
    

  19. 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;"]
    

  20. Construir imagen a partir de Dockerfile

    docker build -t opensuse-nginx .
    

  21. Verificar que se haya creado la imagen de contenedor llamada opensuse-nginx

    docker images
    

  22. Verificar toda la información disponible sobre la imagen creada

    docker inspect opensuse-nginx:latest
    
    docker history opensuse-nginx:latest
    

  23. Crear directorio para volumen persistente para almacenar logs

    mkdir downloads
    

  24. 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
    

  25. Verificar estado del contenedor

    docker ps
    

  26. Desde su navegador de Internet acceda a su HOST de Prueba, acceder en varias ocasiones para generación de logs.

    HOST_EXTERNAL_IP=$(curl -s http://showip.net)
    echo http://${HOST_EXTERNAL_IP}:30080
    
    Acceda a este URL, via su browser o via linea de comando

  27. Mostrar logs del contenedor

    docker logs nginx
    
    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.

  28. Verificar que los logs se encuentren en el directorio del contenedor

    docker exec -it nginx bash -c 'tail /var/log/nginx/access.log'
    

  29. Detenga el contenedor y elimine el contenedor

    docker stop nginx
    
    docker rm nginx
    

  30. 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 
    

  31. 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;"]
    

  32. Construya nuevamente la imágen del contenedor

    docker build -t opensuse-nginx .
    

  33. Ejecute de nuevo el contenedor

    docker run -d --name nginx -v $PWD/downloads:/downloads  -p 30080:80 opensuse-nginx
    

  34. 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
    

  35. Mostrar logs del contenedor

    docker logs nginx
    
    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.

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