Martinez Leonardo

Docker compose y dockerfiles

Publicado el 05 de November, 2025

Compose y Dockerfile

El archivo Dockerfile nos permite poder setear todo nuestro contenedor para despues poder crear una imagen con compose.

El Dockerfile lleva una sintáxis partícular de los archivos. Ejemplo con fastapi en python.

#Desde donde se generará la imagen
FROM python:3.11-slim

#Directorio dentro del contenedor donde se colocarán los datos 
WORKDIR /app

#Copiar todo el contenido actual a /app en el contenedor
COPY . /app

#Comandos a ejecutar dentro del contenedor para su inicio 
#instalar dependencias, etc.
RUN python3 -m venv env
RUN /bin/bash -c "source env/bin/activate"
RUN pip install -r requirements.txt

#Exponer el puerto
EXPOSE 8000

#Comandos a ejecutar cuando se creó el contenedor
CMD ["uvicorn", "main:app", "--host","0.0.0.0","--reload","--port","8000"]

Este archivo Dockerfile será la base de la imagen a generar, que luego se tomará con el docker-compose.yml para crear el contenedor.

El docker-compose.yml posee una sintáxis también propia, en el siguiente ejemplo se genera un contenedor basado en en las imágenes de mongodb y la de python hecha anteriormente.

En este archivo se especifican cómo se creará el contenedor y en qué imagenes se basará.

#Versión de compose
version: "3"

#Servicios a desplegar, pueden tener su nombre propio y distinto de las img
services:
	
	#Primer servicio (imagen de python anterior)
  fastapi:
  
	  #nombre que le pondrémos a la imagen
    image: appimage-fastapi
    
    #donde se buscará el dockerfile para la construcción
    build: .
  
    #nombre del contenedor
    container_name: fastapi-app
  
	  #exposición de puerto contenedor al host
    ports: 
      - "8000:8000"
      
    #Esto crea un enlace entre el contenedor fastapi y el contenedor mongodb, 
    #lo que permite que el contenedor fastapi se comunique con mongodb 
    #utilizando su nombre de servicio mongodb.
    links:
      - mongodb
    
    #Define las variables de entorno que serán utilizadas para acceder al servicio
    #en el contenedor de mongodb
    environment:
      - MONGO_URL=mongodb://mongodb:27017

  mongodb:
    image: mongo:latest
    container_name: mongodb
    ports: 
      - "27017:27017"
    #Define un volumen persistente para MongoDB. Esto asegura que los datos 
    #almacenados en MongoDB persistan incluso si el contenedor es detenido o 
    #eliminado. mongo-data es el nombre del volumen, y /data/db es la ruta 
	  #dentro del contenedor donde MongoDB almacena sus datos.
    volumes:
      - "mongo-data:/data/db"

#Esta sección define el volumen mongo-data. Docker Compose crea y gestiona 
#este volumen, asegurando que los datos de MongoDB persistan entre reinicios 
#del contenedor.
volumes:
  mongo-data:

En conclusión se crean dos servicios fastapi y mongodb:

  • fastapi: Una aplicación FastAPI construida desde un Dockerfile en el directorio actual, con la imagen llamada appimage-fastapi. El contenedor se llama fastapi-app, expone el puerto 8000, y se enlaza con el servicio mongodb para usarlo como base de datos.
  • mongodb: Una base de datos MongoDB usando la imagen mongo:latest de Docker Hub. El contenedor se llama mongodb, expone el puerto 27017, y utiliza un volumen persistente llamado mongo-data.

Por último los comandos para generar el contenedor y eliminarlo.

#creación
docker compose up --build

#eliminar
docker compose down