Skip to content
BotServBotServ
DockerContainerdocker-composeImagesVolumesIAAuto-alojamiento

Fundamentos de Docker: Contenedores para IA

Docker para IA: contenedores, imágenes, volúmenes y docker-compose. Cómo ejecutar servicios IA con Docker. Explicado para principiantes.

S

schutzgeist

13 min read
Fundamentos de Docker: Contenedores para IA

Docker Básico: Contenedores para Servicios de IA

Qué cubre este artículo

  • Qué es Docker y por qué resulta práctico para servicios de IA
  • Cómo se relacionan contenedores, imágenes, volúmenes y docker-compose
  • Cómo instalar Docker en Linux, macOS y Windows
  • Cómo iniciar tu primer contenedor y mantener los datos persistentes
  • Qué escollos encuentran los principiantes y cómo evitarlos

Introducción: Docker explicado de forma clara

Docker ha transformado la manera en que instalamos y ejecutamos software. En lugar de configurar manualmente cada programa con todas sus dependencias, lo empaquetas en un contenedor que contiene todo lo necesario. Esto es especialmente útil para servicios de IA, que frecuentemente tienen dependencias complejas, requieren versiones específicas de Python y no siempre se instalan de forma limpia.

Si quieres ejecutar IA localmente, Docker es prácticamente inevitable. Ya sea Ollama, Open WebUI o una base de datos vectorial como Chroma, casi cualquier servicio de IA ofrece una imagen Docker lista para usar. La descargas, inicias el contenedor y el servicio funciona, sin que tengas que preocuparte por bibliotecas, rutas o conflictos.

Este artículo te guía a través de los fundamentos de Docker que necesitas para servicios de IA. Aprenderás la terminología esencial, instalarás Docker, iniciarás tu primer contenedor y comprenderás cómo funcionan los volúmenes y docker-compose. Al final, construirás Ollama como ejemplo práctico con docker-compose.

Encontrarás más información sobre Self-Hosting en la descripción general de Self-Hosting.

¿Por qué necesito Docker?

Imagina que quieres instalar Ollama en tu servidor. Sin Docker, tendrías que pasar por varios pasos. Instalas las bibliotecas C correctas, te aseguras de que la versión de Python sea la adecuada, configuras un servicio del sistema, estableces rutas para modelos y esperas que nada entre en conflicto con otros programas. Cuando después quieras actualizar o eliminar Ollama, a menudo quedan restos que tienes que limpiar manualmente.

Con Docker, un único comando es suficiente:

docker run -d -p 11434:11434 -v ollama-data:/root/.ollama ollama/ollama

Eso es todo. Docker descarga la imagen, inicia el contenedor y Ollama se ejecuta de forma aislada del resto del sistema. Si quieres actualizarlo, haces pull de la imagen más reciente e inicias de nuevo. Si quieres eliminarlo, detienes el contenedor y lo borras. Sin restos, sin conflictos, sin trabajo de limpieza manual.

Docker resuelve un problema central: funciona en mi máquina, pero no en la tuya. Un contenedor contiene exactamente las bibliotecas y configuraciones que el programa necesita, independientemente del sistema anfitrión. Si el contenedor se ejecuta en tu servidor, también se ejecutará en otro servidor, en un NAS o en la nube.

Docker en pocas palabras

Docker funciona como los barcos de carga. Antes de que existieran contenedores estandarizados, cada carga tenía que cargarse individualmente. Sacos, barriles, cajas, cada pieza requería un trato diferente. Con contenedores normalizados, eso cambió. Cada contenedor tiene las mismas dimensiones, cabe en cualquier barco y se puede cargar con la misma grúa. La carga dentro no importa, el contenedor garantiza compatibilidad.

Docker hace lo mismo para el software. En lugar de instalar manualmente cada programa en el sistema, lo empaquetas en un contenedor normalizado. El contenedor contiene el programa, sus bibliotecas, su configuración y sus dependencias. Docker garantiza que el contenedor se ejecute en cualquier sistema que tenga Docker instalado. El programa dentro no sabe si corre en Linux, macOS o Windows, solo ve su propio entorno aislado.

Para quién está dirigido este artículo

Este artículo va dirigido a principiantes que no conocen Docker o solo lo conocen superficialmente. No necesitas ser un experto en Linux, pero deberías tener conocimientos básicos de terminal. Si alguna vez has ejecutado un comando en la terminal y editado un archivo con un editor de texto, eso es suficiente.

Este es tu lugar si quieres ejecutar servicios de IA como Ollama u Open WebUI por tu cuenta y te preguntas qué es realmente Docker. También es tu lugar si ya has probado Docker, pero aún no entiendes completamente los volúmenes, docker-compose y el mapeo de puertos.

Si ya conoces Docker y estás buscando específicamente compatibilidad con GPU, dirígete al artículo Soporte de GPU en Docker.

Términos importantes

TérminoSignificado
DockerPlataforma que ejecuta aplicaciones en contenedores aislados
ContainerInstancia en ejecución de una imagen, aislada del sistema anfitrión
ImagePlantilla para contenedores, contiene todos los archivos y configuraciones
VolumeAlmacenamiento persistente que asegura los datos más allá del ciclo de vida del contenedor
docker-composeHerramienta para definir e iniciar múltiples contenedores mediante un archivo YAML
Port MappingRedirección de un puerto del anfitrión al contenedor, para que los servicios sean accesibles desde el exterior
DockerfileArchivo de texto con instrucciones para crear una imagen propia
RegistryUbicación para imágenes, por ejemplo Docker Hub
LayerCapa de una imagen, cada instrucción en el Dockerfile crea una capa
NetworkRed virtual a través de la cual los contenedores se comunican entre sí

Instalar Docker

Docker corre nativamente en Linux. En macOS y Windows usas Docker Desktop, que inicia una máquina virtual en segundo plano.

Linux

En Linux, la mejor forma de instalar Docker es mediante el script oficial. En Ubuntu y otras distribuciones basadas en Debian funciona así:

curl -fsSL https://get.docker.com | sudo sh

Luego añades tu usuario al grupo Docker para ejecutar comandos Docker sin sudo:

sudo usermod -aG docker $USER

Cierra sesión y vuelve a iniciarla para que el cambio surta efecto. Verifica la instalación con:

docker --version

macOS

En macOS, descargas Docker Desktop desde el sitio web oficial e lo instalas como una aplicación normal. Inicia Docker Desktop y espera a que el icono de ballena en la barra de menú esté estable. Después, todos los comandos docker funcionarán en la terminal.

En Macs con Apple Silicon, Docker Desktop utiliza automáticamente la arquitectura ARM. Asegúrate de descargar imágenes que estén disponibles para ARM. Muchas imágenes oficiales ya ofrecen variantes linux/arm64.

Windows

En Windows, también instalas Docker Desktop. El requisito previo es WSL2, el Subsistema de Windows para Linux. Docker Desktop configura WSL2 automáticamente si aún no está presente. Después de la instalación, todos los comandos Docker funcionan en PowerShell o CMD.

El soporte de GPU en Windows funciona con WSL2 y un controlador Nvidia que sea compatible con WSL2. Más información en el artículo Soporte de GPU en Docker.

Primeros pasos

Después de la instalación, prueba que Docker funcione correctamente. El comando clásico inicial es:

docker run hello-world

Docker descarga una pequeña imagen de prueba y la ejecuta. Si ves un mensaje de bienvenida, Docker funciona. Si aparece un error de permisos, probablemente aún no hayas añadido tu usuario al grupo Docker o no hayas cerrado sesión nuevamente.

Muestra todos los contenedores en ejecución:

docker ps

Con -a también ves los contenedores detenidos:

docker ps -a

Muestra todas las imágenes que has descargado:

docker images

Estos tres comandos, docker run, docker ps e docker images, cubren las acciones más importantes. Inicias contenedores, compruebas su estado y ves qué imágenes tienes disponibles localmente.

Volúmenes y datos

Los contenedores son efímeros. Si eliminas un contenedor, pierdes todos los datos que contiene. Para servicios de IA esto es un problema, porque los modelos ocupan mucho espacio y no quieres descargarlos de nuevo cada vez que reinicies.

Los volúmenes resuelven esto. Un volumen es almacenamiento persistente que existe independientemente del contenedor. Lo vinculas al contenedor y cualquier dato que escriba allí permanece, incluso si eliminas y recreas el contenedor.

Para vincular un volumen a un contenedor:

docker run -d --name ollama -p 11434:11434 -v ollama-data:/root/.ollama ollama/ollama

El parámetro -v ollama-data:/root/.ollama crea un volumen con nombre llamado ollama-data y lo vincula dentro del contenedor en /root/.ollama. Allí es donde Ollama almacena sus modelos. Si eliminas y reinicializas el contenedor, los modelos siguen ahí.

Para listar todos los volúmenes:

docker volume ls

Para eliminar un volumen que ya no necesitas:

docker volume rm ollama-data

Como alternativa a los volúmenes con nombre, puedes usar Bind Mounts, que vinculan un directorio específico del sistema anfitrión dentro del contenedor:

docker run -d --name ollama -p 11434:11434 -v /home/user/ollama:/root/.ollama ollama/ollama

Los Bind Mounts te dan acceso directo a los archivos en el anfitrión, lo que resulta útil para copias de seguridad e inspección. Los volúmenes con nombre están gestionados por Docker y son la opción más sencilla para la mayoría de casos de uso.

docker-compose

Si solo ejecutas un contenedor, docker run es suficiente. Pero cuando combinas varios servicios, por ejemplo Ollama y Open WebUI, la línea de comandos se vuelve larga e ilegible. Aquí entra en juego docker-compose.

docker-compose es una herramienta que te permite describir contenedores en un archivo YAML. En lugar de comandos largos, escribes un archivo docker-compose.yml e inicias todo con un solo comando.

Un ejemplo simple:

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama-data:/root/.ollama
    restart: unless-stopped

volumes:
  ollama-data:

Inicia la configuración con:

docker compose up -d

Para detener y eliminar:

docker compose down

El flag -d inicia los contenedores en segundo plano. Sin -d se ejecutan en primer plano y ves los logs directamente en la terminal, lo que ayuda al depurar.

docker-compose tiene varias ventajas. Tu configuración existe como archivo que puedes versionar, compartir y reproducir en otra máquina. Defines múltiples servicios en un solo archivo y docker-compose los interconecta automáticamente para que se comuniquen. No necesitas memorizar comandos docker run largos.

Ejemplo: Ollama con Docker

Ollama es un excelente punto de partida para servicios de IA con Docker. Es popular, tiene una imagen oficialmente mantenida y funciona tanto con CPU como con GPU. En este ejemplo, configurarás Ollama con docker-compose, incluyendo persistencia y reinicio automático.

Paso 1: Crear un directorio

Crea un directorio para tu configuración Docker:

mkdir ~/ollama-docker
cd ~/ollama-docker

Paso 2: Crear docker-compose.yml

Crea un archivo llamado docker-compose.yml con el siguiente contenido:

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama-data:/root/.ollama
    restart: unless-stopped

volumes:
  ollama-data:

Paso 3: Iniciar el contenedor

Inicia el contenedor:

docker compose up -d

Docker descarga la imagen si aún no la tienes localmente e inicia el contenedor. Comprueba el estado:

docker ps

Deberías ver un contenedor llamado ollama en ejecución.

Paso 4: Cargar un modelo

Descarga un modelo en el contenedor en ejecución:

docker exec -it ollama ollama pull llama3

Después inicia el modelo:

docker exec -it ollama ollama run llama3

Se abre el chat interactivo. Usa /bye para cerrar la sesión.

Paso 5: Probar la API

Verifica que la API sea accesible:

curl http://localhost:11434/

Si obtienes Ollama is running como respuesta, todo funciona. Encontrarás más información sobre la API y cómo combinarla con otras herramientas en el artículo Ollama con Docker.

Si quieres ejecutar Ollama con GPU, añade la configuración de GPU a tu docker-compose.yml. Los detalles están en el artículo GPU-Unterstützung in Docker.

Tropiezos comunes

Permission denied al ejecutar comandos Docker. No has agregado tu usuario al grupo Docker. Ejecuta sudo usermod -aG docker $USER y vuelve a iniciar sesión. Después los comandos Docker funcionarán sin sudo.

Los datos desaparecen después de reiniciar el contenedor. No vinculaste un volumen. Sin -v el contenedor almacena todo en su propio sistema de archivos, que se pierde cuando lo eliminas. Usa siempre un volumen para datos que deben persistir.

El puerto ya está en uso. Si el puerto que quieres mapear lo está usando otro programa, el contenedor no inicia. Comprueba con sudo lsof -i :11434 qué proceso lo ocupa, detenlo o elige otro puerto.

El contenedor se reinicia inmediatamente. Si un contenedor se bloquea poco después de iniciar, generalmente es un error de configuración. Revisa los logs con docker logs containername. La mayoría de las veces el mensaje de error muestra exactamente qué salió mal.

La imagen no está disponible para la arquitectura correcta. En Macs con Apple Silicon o servidores ARM, puede ocurrir que una imagen solo esté disponible para x86_64. Docker intenta entonces emularla, lo cual es extremadamente lento o no funciona. Verifica si la imagen ofrece una variante linux/arm64.

El comando docker-compose no funciona. Las versiones antiguas usan docker-compose con guión, las nuevas lo usan como subcomando docker compose. Ambos funcionan, pero si tienes una versión reciente de Docker, usa docker compose.

El disco se llena. Cada imagen y contenedor consume espacio. Las imágenes antiguas y contenedores detenidos se acumulan con el tiempo. Limpia con docker system prune, que elimina todas las imágenes, contenedores y redes no utilizados.

Hardware, costos y seguridad

Docker en sí es gratuito y código abierto. Docker Desktop es gratuito para uso personal, aunque las empresas más grandes deben revisar los términos de licencia. Los requisitos de hardware dependen de lo que ejecutes en los contenedores. Docker consume pocos recursos, pero servicios de IA como Ollama necesitan suficiente RAM e idealmente una GPU.

Desde el punto de vista de la seguridad hay algunos aspectos a considerar. Los contenedores están aislados, pero no son automáticamente seguros. No expongas puertos directamente a Internet sin protección, usa en su lugar un reverse proxy con autenticación. Descarga imágenes solo de fuentes confiables, preferiblemente imágenes oficiales o publicadores verificados en Docker Hub. Para imágenes no oficiales, lee el Dockerfile antes de usarlo, especialmente si procesa datos sensibles.

Encontrarás más información sobre cómo operar configuraciones de Self-Hosting de forma segura en el artículo Sicherer Betrieb.

Enlaces de referencia

FAQ: Fundamentos de Docker

¿Cuál es la diferencia entre Docker y una máquina virtual?

Una máquina virtual emula un sistema operativo completo con su propio kernel. Un contenedor Docker utiliza el kernel del sistema host y solo contiene la aplicación y sus dependencias. Por eso los contenedores son más ligeros y se inician más rápido que las máquinas virtuales.

¿Necesito Linux para usar Docker?

No. Docker se ejecuta de forma nativa en Linux, mientras que en macOS y Windows usas Docker Desktop, que inicia una máquina virtual en segundo plano. Los comandos de Docker son idénticos en todas las plataformas.

¿Cuál es la diferencia entre una imagen y un contenedor?

Una imagen es una plantilla estática que contiene todos los archivos y configuraciones. Un contenedor es una instancia en ejecución de una imagen. Puedes iniciar tantos contenedores como desees a partir de una imagen.

¿Los datos en un contenedor están seguros?

No, no automáticamente. Si eliminas un contenedor, los datos desaparecen. Usa volúmenes para almacenar datos de forma persistente, de modo que se conserven incluso después de eliminar y recrear el contenedor.

¿Cuánto cuesta Docker?

Docker Engine y docker-compose son Open Source y gratuitos. Docker Desktop es gratuito para uso personal y pequeñas empresas, aunque hay términos de licencia para empresas más grandes.

¿Puedo usar Docker sin Internet?

Sí, después de descargar todas las imágenes necesarias. Descargar imágenes requiere Internet, pero iniciar y detener contenedores funciona sin conexión.

¿Cuál es la diferencia entre docker-compose y Kubernetes?

docker-compose está pensado para un único host y define múltiples contenedores en un archivo YAML. Kubernetes es un orquestador de clústeres para configuraciones grandes distribuidas entre múltiples máquinas. Para Self-Hosting, docker-compose suele ser suficiente.

¿Cómo actualizo un contenedor?

Descarga la última imagen con docker pull imagename, detén el contenedor en ejecución, elimínalo e inicia uno nuevo. Si usas un volumen, tus datos se conservan. Con docker-compose, basta con ejecutar docker compose pull seguido de docker compose up -d.

¿Puedo ejecutar múltiples contenedores en el mismo puerto?

No, no en el mismo puerto del host. Cada puerto solo puede vincularse una vez. Sin embargo, puedes usar diferentes puertos del host y mapearlos todos al mismo puerto del contenedor, por ejemplo -p 11435:11434 para el segundo contenedor.

¿Qué es un Dockerfile?

Un Dockerfile es un archivo de texto con instrucciones para crear tu propia imagen. En él defines qué imagen base se utiliza, qué archivos se copian y qué comandos se ejecutan al iniciar. Si usas imágenes ya existentes, no necesitas tu propio Dockerfile.

¿Cómo veo los logs de un contenedor?

Con docker logs containername ves el resultado del contenedor. Con docker logs -f containername los logs se actualizan en tiempo real, lo que ayuda durante la depuración.

Fuentes

  • Documentación oficial de Docker
  • Docker Hub
  • Especificación de docker-compose
  • Repositorio de Ollama en Docker Hub
  • Documentación del NVIDIA Container Toolkit
Volver al blog
Share:

Entradas relacionadas