Construir imágenes antes de iniciar contenedores
En los pasos anteriores, utilizamos imágenes Docker preconstruidas de Docker Hub (como nginx:latest). Sin embargo, frecuentemente necesitarás construir tus propias imágenes Docker personalizadas para tus aplicaciones.
Docker Compose puede construir automáticamente las imágenes definidas en tu archivo docker-compose.yml antes de iniciar los servicios. Esto se hace típicamente especificando un contexto de build en lugar de un nombre de image para un servicio.
Modifiquemos nuestro archivo docker-compose.yml para construir una imagen personalizada simple de Nginx.
Primero, crea un nuevo directorio llamado nginx_custom dentro de ~/project:
cd ~/project
mkdir nginx_custom
Ahora, crea un Dockerfile dentro del directorio nginx_custom:
nano ~/project/nginx_custom/Dockerfile
Agrega el siguiente contenido al Dockerfile:
FROM nginx:latest
RUN echo '<h1>Hello from Custom Nginx!</h1>' >/usr/share/nginx/html/index.html
Este Dockerfile parte de la imagen oficial nginx:latest y luego reemplaza el archivo index.html predeterminado con uno personalizado.
A continuación, modifica tu archivo ~/project/docker-compose.yml para usar este Dockerfile y construir la imagen del servicio web. Abre el archivo para editar:
nano ~/project/docker-compose.yml
Cambia la definición del servicio web para usar build en lugar de image:
version: "3.8"
services:
web:
build: ./nginx_custom
ports:
- "80:80"
Ahora, cuando ejecutes docker compose up, Docker Compose primero construirá la imagen definida por el Dockerfile en el directorio ./nginx_custom y luego iniciará un contenedor usando esa imagen recién construida.
Asegúrate de estar en el directorio ~/project y ejecuta:
cd ~/project
docker compose up -d
Verás una salida que indica que Docker Compose está construyendo la imagen y luego creando e iniciando el contenedor.
Para verificar que se está sirviendo la página personalizada de Nginx, usa curl:
curl http://localhost
Deberías ver la salida <h1>Hello from Custom Nginx!</h1>, confirmando que la imagen fue construida y el contenedor se está ejecutando con el contenido personalizado.
Para limpiar, detén los servicios en ejecución:
cd ~/project
docker compose down