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érmino | Significado |
|---|---|
| Docker | Plataforma que ejecuta aplicaciones en contenedores aislados |
| Container | Instancia en ejecución de una imagen, aislada del sistema anfitrión |
| Image | Plantilla para contenedores, contiene todos los archivos y configuraciones |
| Volume | Almacenamiento persistente que asegura los datos más allá del ciclo de vida del contenedor |
| docker-compose | Herramienta para definir e iniciar múltiples contenedores mediante un archivo YAML |
| Port Mapping | Redirección de un puerto del anfitrión al contenedor, para que los servicios sean accesibles desde el exterior |
| Dockerfile | Archivo de texto con instrucciones para crear una imagen propia |
| Registry | Ubicación para imágenes, por ejemplo Docker Hub |
| Layer | Capa de una imagen, cada instrucción en el Dockerfile crea una capa |
| Network | Red 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
- Descripción general de Self-Hosting para iniciarse en el tema
- Ubuntu como base para servidores Docker
- Soporte GPU en Docker para configuración de GPU
- Ollama con Docker para una configuración completa de Ollama
- Open WebUI como interfaz para Ollama
- Operación segura para seguridad en Self-Hosting
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


