clase:daw:daw:tema04
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| clase:daw:daw:tema04 [2026/10/28 09:57] – borrado - editor externo (Fecha desconocida) 127.0.0.1 | clase:daw:daw:tema04 [2026/10/28 10:20] (actual) – Figura Docker Hub/Dockerfile → imagen → contenedor en «Creación de imágenes» claude | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| + | ====== 4. Docker: Creación de imágenes. Dockerfile ====== | ||
| + | En el apartado anterior vimos lo básico para empezar a usar Docker. En este apartado vamos a ver como crear nuestras propias imágenes. | ||
| + | |||
| + | |||
| + | Mas información: | ||
| + | * {{docker_performance.pdf|An Updated Performance Comparison of Virtual Machines and Linux Containers}} | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | |||
| + | ===== Creación de imágenes ===== | ||
| + | Un contenedor se crea desde una imagen, y la imagen se descarga ya hecha de Docker Hub ('' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Podemos crear nuestras propias imágenes si ninguna de las que hay hace lo que nosotros necesitamos. Para ello usaremos el comando '' | ||
| + | |||
| + | El comando '' | ||
| + | |||
| + | <sxh> | ||
| + | docker buildx build --tag nombre_imagen: | ||
| + | </ | ||
| + | |||
| + | Donde: | ||
| + | - '' | ||
| + | - '' | ||
| + | - '' | ||
| + | |||
| + | * Ejemplo de uso: Crea la imagen llamada '' | ||
| + | <sxh> | ||
| + | docker buildx build -t mi_aplicacion_web: | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Estructura Básica del Dockerfile ===== | ||
| + | Un Dockerfile contiene instrucciones para la construcción de una imagen. Aquí se muestra una estructura básica: | ||
| + | |||
| + | <sxh> | ||
| + | # Especifica la imagen base | ||
| + | FROM imagen_base: | ||
| + | |||
| + | # Instrucciones para configurar la imagen | ||
| + | RUN comando1 | ||
| + | RUN comando2 | ||
| + | |||
| + | # Copia archivos locales al contenedor | ||
| + | COPY origen destino | ||
| + | |||
| + | # Documenta que puerto usa el contenedor | ||
| + | EXPOSE puerto | ||
| + | |||
| + | #El directorio de trabajo | ||
| + | WORKDIR /directorio | ||
| + | |||
| + | # Define variables de entorno | ||
| + | ENV variable=valor | ||
| + | |||
| + | # Comando para ejecutar la aplicación o servicio | ||
| + | CMD [" | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | - **FROM**: Indica la imagen base desde la cual se construirá la nueva imagen. La versión es opcional. | ||
| + | |||
| + | <sxh> | ||
| + | FROM eclipse-temurin: | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | - **RUN**: Ejecuta comandos en una nueva capa del contenedor. Se utiliza para instalar paquetes, configurar el entorno y realizar otras acciones durante la construcción de la imagen. | ||
| + | |||
| + | <sxh> | ||
| + | RUN mkdir /opt/app | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | - **COPY**: Copia archivos desde la ruta de origen en la máquina host hacia el contenedor en la ruta de destino. | ||
| + | <sxh> | ||
| + | COPY ./app.jar /opt/app | ||
| + | </ | ||
| + | |||
| + | <note warning> | ||
| + | La ruta absoluta del origen del copia es a partir de la ruta '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | <note important> | ||
| + | ¿Qué es mejor copiar ficheros dentro con '' | ||
| + | |||
| + | ^ Opción ^ Ventaja | ||
| + | | Copiar ficheros desde fuera con '' | ||
| + | | Descargar ficheros desde el '' | ||
| + | |||
| + | </ | ||
| + | |||
| + | - **EXPOSE**: Informa a Docker que el contenedor escuchará en el puerto especificado en tiempo de ejecución. No publica el puerto en la máquina real ni hace realmente nada. Es simplemente para documentar en que puerto | ||
| + | |||
| + | <sxh> | ||
| + | EXPOSE 8080 | ||
| + | </ | ||
| + | |||
| + | - **WORKDIR**: | ||
| + | |||
| + | <sxh> | ||
| + | WORKDIR /opt/app | ||
| + | </ | ||
| + | |||
| + | - **ENV**: Define variables de entorno dentro del contenedor. | ||
| + | |||
| + | <sxh> | ||
| + | ENV ENTORNO=produccion | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | - **CMD**: Especifica el comando predeterminado que se ejecutará cuando el contenedor se inicie. **Solo puede haber una comando '' | ||
| + | |||
| + | <sxh> | ||
| + | CMD [" | ||
| + | </ | ||
| + | |||
| + | |||
| + | <note tip> | ||
| + | Las diferencias entre '' | ||
| + | </ | ||
| + | |||
| + | ===== Ejemplo: Ejecutar app java ===== | ||
| + | Una imagen basada en el JDK 17 que ya incluye maven. | ||
| + | |||
| + | Al crear la imagen se hace lo siguiente | ||
| + | * Instalar Git | ||
| + | * Descargar el código fuente | ||
| + | * Compilar | ||
| + | |||
| + | Al arrancar el contenedor se ejecuta | ||
| + | * '' | ||
| + | |||
| + | |||
| + | <sxh> | ||
| + | FROM maven: | ||
| + | |||
| + | ENV DEBIAN_FRONTEND=noninteractive | ||
| + | |||
| + | RUN apt-get update | ||
| + | RUN apt-get install -y git | ||
| + | |||
| + | RUN mkdir /opt/app | ||
| + | WORKDIR /opt/app | ||
| + | RUN git clone https:// | ||
| + | WORKDIR / | ||
| + | RUN mvn clean install | ||
| + | |||
| + | EXPOSE 8080 | ||
| + | |||
| + | |||
| + | CMD [" | ||
| + | |||
| + | </ | ||
| + | |||
| + | Para crear la imagen ejecutamos | ||
| + | <sxh bash> | ||
| + | docker buildx build --no-cache --tag tienda-back: | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | Sin '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | Finalmente la ejecutamos con | ||
| + | <sxh bash> | ||
| + | docker container run -p 8081:8080 --name tienda-back tienda-back: | ||
| + | </ | ||
| + | |||
| + | ====== Multiples imagenes ====== | ||
| + | Acabamos de ver que hemos tenido la suerte de tener una imagen con el JDK y con maven pero no siempre tenemos esa suerte. | ||
| + | Para Angular necesitamos hacer el build con una imagen que tenga NodeJS pero tambien que tenga NGINX. | ||
| + | Podemos construir una imagen con todo ello pero lo más sencillo es una 2 imágenes distintas y copiar el resultado de uno en el otro. | ||
| + | |||
| + | Vamos a ver ahora como un '' | ||
| + | * Imagen con NodeJS para compilar el código de Angular | ||
| + | * Imagen con NGINX que hace de servidor HTTP para desplegar la aplicación | ||
| + | |||
| + | <sxh yml; | ||
| + | FROM node: | ||
| + | |||
| + | RUN apt-get update | ||
| + | RUN apt-get install -y git | ||
| + | |||
| + | RUN mkdir /opt/app | ||
| + | WORKDIR /opt/app | ||
| + | RUN git clone https:// | ||
| + | WORKDIR / | ||
| + | RUN npm ci | ||
| + | RUN npm run build --prod | ||
| + | |||
| + | |||
| + | |||
| + | FROM nginx: | ||
| + | COPY --from=build / | ||
| + | EXPOSE 80 | ||
| + | CMD [" | ||
| + | </ | ||
| + | |||
| + | * En la línea 1 vemos como se usa la imagen '' | ||
| + | * En las siguientes lineas compilamos el código de Angular | ||
| + | * En la línea 15 se crea una nueva imagen '' | ||
| + | * En la línea 16 es cuando se copia el código compìlado de Angular desde la imagen '' | ||
| + | |||
| + | <note tip>Al concatenar las 2 imágenes únicamente que crea la segunda.</ | ||
| + | |||
| + | Para crear la imagen ejecutamos | ||
| + | <sxh bash> | ||
| + | docker buildx build --no-cache --tag tienda-front: | ||
| + | docker image prune -f | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | |||
| + | |||
| + | |||
| + | Finalmente la ejecutamos con '' | ||
| + | <sxh bash> | ||
| + | docker container run -p 80:80 --name tienda-front tienda-front: | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== Ejercicios ===== | ||
| + | |||
| + | ==== Ejercicio 1:Crear la imagen ==== | ||
| + | Crea una imagen de docker basada en '' | ||
| + | * Con '' | ||
| + | * Con '' | ||
| + | |||
| + | |||
| + | |||
| + | La imagen se llamará '' | ||
| + | |||
| + | Crea un contenedor con esa imagen de forma que con '' | ||
| + | |||
| + | |||
| + | ==== Ejercicio 2:Sin crear imagen ==== | ||
| + | En la imagen '' | ||
| + | |||
| + | Así que ejecuta un '' | ||
| + | |||
| + | <sxh base> | ||
| + | sudo docker container run \ | ||
| + | -v / | ||
| + | eclipse-temurin: | ||
| + | java -jar /tmp/mi.jar | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | En la orden '' | ||
| + | </ | ||
| + | |||
| + | ==== Ejercicio 3:Maven ==== | ||
| + | Ahora vamos a generar el '' | ||
| + | |||
| + | |||
| + | Para hacerlo hay que poner el código fuente en ''/ | ||
| + | |||
| + | <sxh base> | ||
| + | sudo docker container run \ | ||
| + | -v / | ||
| + | -w / | ||
| + | maven: | ||
| + | mvn clean package | ||
| + | </ | ||
| + | |||
| + | |||
| + | <note important> | ||
| + | En la orden '' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | ¿Que opciones usarás? | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * ???? | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Ejercicio 4:Deploy ==== | ||
| + | Has un script en la máquina real llamado '' | ||
| + | * Se baje el código fuente de git | ||
| + | * Genere el '' | ||
| + | * Ejecute el '' | ||
| + | |||
| + | ==== Ejercicio 5:MySQL ==== | ||
| + | Crea ahora una base de datos MySQL en un contenedor docker de forma que sea la que estás usando en el módulo de servidor. | ||
| + | Rellena la base de datos con los datos. | ||
| + | |||
| + | ==== Ejercicio 6:Deploy proyecto ==== | ||
| + | Compila y desplega el proyecto que usas en el módulo de servidor de forma que se genere el '' | ||
| + | |||
| + | |||
| + | ==== Ejercicio 7:Deploy proyecto ==== | ||
| + | Modifica el proyecto de Maven de forma que tambien se haga lo necesario para " | ||
| + | |||
| + | |||
| + | |||
| + | <note tip> | ||
| + | Hasta aquí han sido los ejercicios para el despliegue automático, | ||
| + | </ | ||
| + | |||
| + | ==== Ejercicio 8: MySQL compañero ==== | ||
| + | Prueba ahora a modificaar el código de forma que te conectes al MySQL de tu compañero. Deberá dejarte. | ||
| + | |||
| + | |||
| + | ==== Ejercicio 9:Red ==== | ||
| + | Crea ahora una red llamada '' | ||
| + | |||
| + | Modifica la creación de los contenedores para que estén asociados a la red que acabas de crear. | ||
| + | |||
| + | Prueba que todo sigue funcionando. | ||
| + | |||
| + | ==== Ejercicio 10: MySQL compañero ==== | ||
| + | Prueba ahora a modificaar el código de forma que te conectes al MySQL de tu compañero. No debería dejarte ya que estáis en redes distintas. | ||
| + | |||
| + | |||
| + | ==== Ejercicio 11: Docker compose ==== | ||
| + | Modifica el script '' | ||
| + | |||
| + | Para ello deberás crear un fichero llamado '' | ||
