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