Programa
Si te preguntas cómo ejecutar una imagen Docker, no estás solo. Tanto si acabas de extraer una imagen de Docker Hub como si has creado una tú mismo, ejecutarla es el paso clave que da vida a tu aplicación.
Este tutorial es tu guía para principiantes sobre el comando docker run
y mucho más. Aprenderás:
- Qué son realmente las imágenes Docker y los contenedores.
- Cómo ejecutar una imagen utilizando diferentes opciones.
- Y cómo detener, eliminar y solucionar problemas de los contenedores como un profesional.
Al final, te sentirás seguro lanzando tus propios contenedores y comprendiendo exactamente lo que ocurre bajo el capó.
Comprender las imágenes Docker y los contenedores
Antes de entrar en los ejemplos de comandos, vamos a entender las imágenes Docker y los contenedores en términos sencillos.
Si ya estás familiarizado con estos términos, ¡no dudes en pasar a la siguiente sección!
¿Qué es una imagen Docker?
Una imagen Docker es un plano inmutable de tu aplicación. Define todo lo que necesita tu contenedor: el código, las bibliotecas, el entorno y las configuraciones. Una vez que tengas una imagen, puedes utilizarla para hacer girar un contenedor o cien. Siempre se mantiene constante.
Entonces, ¿de dónde vienen las imágenes? Dockerfile los construye. Un Dockerfile es donde defines qué imagen base utilizar, qué dependencias instalar y cómo debe ejecutarse tu aplicación.
Una vez que tu Dockerfile esté listo, ejecuta el comando docker build
. Este comando sigue los pasos del archivo y los convierte en una imagen reutilizable.
¿Qué es un contenedor Docker?
Un contenedor Docker es la versión activa de una imagen Docker. Permite que tu aplicación se ejecute en su propio entorno aislado, garantizando un comportamiento coherente independientemente del sistema anfitrión.
Sigue el enfoque "compila una vez, ejecuta en cualquier lugar", para que no tengas que configurar manualmente el entorno cada vez.
Imagen frente a contenedor
En la tabla siguiente se comparan una imagen y un contenedor:
Imagen |
Contenedor |
Una imagen es un paquete estandarizado que incluye todos los archivos, binarios, bibliotecas y configuraciones para ejecutar un contenedor. |
Una instancia en tiempo de ejecución de una imagen. |
Una imagen es inmutable. Eso significa que no puede cambiar hasta que se reconstruya. |
El contenedor es mutable. Puedes modificarlo mientras se está ejecutando, instalar nuevos paquetes o cambiar los archivos de configuración. |
Un Dockerfile (conjunto de instrucciones para construir una imagen) crea una imagen. |
Una imagen crea un contenedor. |
Tu ordenador almacena archivos de imagen. |
Un contenedor se ejecuta en tu memoria. |
Si eres nuevo en la contenedorización, nuestro curso Introducción a Docker te guía a través de los conceptos básicos con ejemplos prácticos.
El comando docker run
Cuando ejecutas el comando docker run
, le estás diciendo a Docker que ponga en marcha un nuevo contenedor basado en una imagen.
En términos sencillos, estás lanzando un programa dentro de un entorno aislado. Ese programa puede ser cualquier cosa, una simple aplicación web o un servicio completo con múltiples procesos.
Sintaxis básica
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS]
- Banderas adicionales para personalizar cómo se ejecuta el contenedorIMAGE
- El nombre de la imagen Docker[COMMAND]
- (Opcional) Anula el comando por defecto de la imagen.[ARG...]
- (Opcional) Argumentos.
Banderas y opciones comunes
-d
: Modo independiente: ejecuta los contenedores en segundo plano-p
: Asignación de puertos: Para acceder a un servicio (como una API o una aplicación web) desde tu navegador, necesitas exponer un puerto. Ejemplo:-p 3000:3000
asigna el puerto 3000 de tu máquina al puerto 3000 del contenedor.--name
: Docker da al contenedor un nombre por defecto, pero puedes utilizar esta bandera para darle un nuevo nombre.-v
: Se utiliza para mantener los datos separados del propio contenedor, asegurando que permanezcan aunque el contenedor se detenga o se elimine.--rm
: Cuando el contenedor se detiene, esta bandera lo borra automáticamente.-e
: Utilízalo para introducir contraseñas de bases de datos o claves API sin codificarlas en tu aplicación.
Ejecutar contenedores interactivos frente a independientes
Docker ejecuta los contenedores de dos formas: en modo interactivo (-it
) y en modo separado (-d
). Cada modo tiene casos de uso específicos en función de tus objetivos.
-it
: Modo interactivo: Si quieres trabajar directamente dentro de un contenedor utilizando el terminal, puedes utilizar la bandera-it
. Pone el contenedor en modo interactivo, para que puedas escribir comandos, ver la salida y trabajar en tiempo real.-i
: Mantiene abierta la entrada para que puedas escribir comandos en el contenedor-t
: Te proporciona una interfaz similar a un terminal dentro del contenedor-d
: Modo independiente: Ejecuta el contenedor en segundo plano, de modo que tu terminal queda libre para otras tareas.
Mantén los comandos clave y las mejores prácticas al alcance de tu mano con nuestra Hoja de trucos de Docker para la Ciencia de Datos.
Extraer y ejecutar imágenes Docker
Ahora que conoces la sintaxis del comando docker run
, esta sección te mostrará cómo crear imágenes personalizadas y ejecutarlas.
Utilizar imágenes de Docker Hub
Docker Hub es como una biblioteca online de imágenes de contenedores. Puedes utilizar las que ya están creadas o subir las tuyas para compartirlas con los demás. Admite repositorios públicos y privados, para que puedas compartir imágenes abiertamente con la comunidad o implantar controles de acceso para tus equipos internos.
Ejecutar imágenes personalizadas
Para ejecutar una imagen Docker, primero tendrás que construirla utilizando un archivo Dockerfile. Luego, puedes ejecutarlo localmente o enviarlo al Docker Hub para compartirlo.
Así que, primero vamos a crear un Dockerfile. Aquí tienes una muestra:
# Use official Python base image
FROM python:3.11-slim
# Set working directory in the container
WORKDIR /app
# Copy requirements file and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the app code
COPY . .
EXPOSE 5000
# Set default command
CMD ["python", "app.py"]
¿Qué significa el Dockerfile anterior?
FROM python:3.11-slim
: imagen base con la versión Python 3.11WORKDIR /app
: Establece/app
como directorio de trabajo dentro del contenedor.COPY requirements.txt .
mueve todas las dependencias de la máquina local al directorio de aplicaciones del contenedor.RUN pip install --no-cache-dir -r requirements.txt
: instala las dependencias en requirements.txt.COPY . .
: copia el código del directorio de trabajo actual (aplicaciones, archivos de configuración y otros) en el directorio de aplicaciones del contenedor.- CMD ["python", "app.py"]: ejecuta app.py al iniciar un contenedor desde esta imagen.
Paso 1. Construir Dockerfile
Veamos qué ocurre cuando construyes este Dockerfile.
- Ejecuta el siguiente comando:
docker build -t my-python-app .
Nota: Para que este comando funcione, primero debes tener Docker configurado en tu sistema; esta guía te ayuda a hacerlo.
Esto es lo que ocurre entre bastidores cuando ejecutas el comando de compilación:
- Docker lee el archivo Dockerfile
- La imagen base de Python se extrae de Docker Hub
- El directorio de trabajo se establece en
/app
. - El
requirements.txt
se copia en el contenedor. - Las dependencias se instalan utilizando
pip install
. - El resto de tu código se copia en
/app
. - La imagen final está etiquetada como
my-python-app
.
Paso 2: Ejecutar Dockerfile
Una vez construida tu imagen, puedes ejecutarla utilizando:
docker run -p 5000:5000 my-python-app
Esto es lo que ocurre cuando lo ejecutas
- Se crea un nuevo contenedor a partir de tu imagen personalizada,
my-python-app
. - El puerto 5000 de tu máquina está asignado al puerto 5000 del contenedor (
-p 5000:5000
). - La página
CMD ["python", "
app.py"] se ejecuta y ejecuta la app. - El contenedor se ejecuta en segundo plano gracias a la opción
-d
(modo separado).
En este punto, puedes visitar http://localhost:5000
en tu navegador, y verás algo como lo siguiente, lo que significa que tu aplicación se está ejecutando:
Si trabajas en machine learning, estas mejores imágenes Docker para ML e IA puedenacelerar la configuración de tu entorno.
Ejecutar imágenes con configuración
Para algunas aplicaciones, puede que necesites ejecutar imágenes con una configuración específica. He aquí dos ejemplos comunes.
Datos persistentes
Los contenedores almacenan datos temporalmente. Una vez que los eliminas, los datos desaparecen. Un volumen es una forma de almacenar datos fuera del contenedor para que persistan aunque se elimine o reinicie el contenedor.
Para montar un volumen, tienes que ejecutar un comando como el siguiente:
docker run -v my-volume:/app/data my-image
Los datos escritos en /app/data
se guardan en el volumen incluso después de retirar el contenedor.
Pasar variables de entorno
Las variables de entorno pasan ajustes de configuración a un contenedor Docker en tiempo de ejecución. Esto personaliza tus contenedores Docker sin modificar tus imágenes Docker.
Tienes dos formas de pasar variables de entorno:
- Puedes pasar variables de entorno utilizando el parámetro
-e
. Aquí tienes un comando de ejemplo:
docker run -e ENV=production -e DEBUG=False my-image
- Puedes crear un archivo
.env
con todas las variables de entorno y pasárselo al comando. He aquí un ejemplo:
docker run --env-file .env my-image
Ejemplo de archivo .env
:
ENV=staging
DEBUG=True
SECRET_KEY=mysecret
Gestionar contenedores en ejecución
Una vez que un contenedor se está ejecutando, puedes verlo, detenerlo y acceder a él. Veamos cómo hacerlo.
Ver contenedores activos
Para listar todos los contenedores Docker activos que se están ejecutando en tu sistema, ejecuta el comando docker ps
o docker container ls
. Este comando muestra el ID del contenedor, la imagen, el comando, el puerto, el estado y otros detalles.
docker ps
# or
docker container ls
Para incluir todos los contenedores, no sólo los que están en ejecución, como los que salieron o se crearon pero no se iniciaron, utiliza la bandera -a
:
docker ps -a
Para ver sólo el contenedor creado más recientemente, utiliza la bandera -l
(último):
docker ps -l
Si quieres ver todos los contenedores ordenados por hora de creación, con los más recientes en primer lugar, ejecuta
docker ps -a --sort=created
Parar y retirar contenedores
Para detener un contenedor concreto en ejecución, utiliza el comando docker stop
seguido del ID o nombre del contenedor:
docker stop <container_id_or_name>
Para detener todos los contenedores en ejecución, utiliza
docker stop $(docker ps -q)
$(docker ps -q)
devuelve una lista de todos los ID de contenedor en ejecución.
Una vez detenido un contenedor, puedes eliminarlo utilizando:
docker rm <container_id_or_name>
Para eliminar todos los contenedores parados, ejecuta
docker container prune
Para ir más allá y eliminar contenedores, volúmenes, redes e imágenes no utilizados, consulta la guía de poda de Docker.
Acceder a los registros del contenedor y al terminal
- docker logs - El comando
docker logs
recupera por lotes los logs presentes en el momento de la ejecución. - docker exec -
docker exec
te permite ejecutar un nuevo comando dentro de un contenedor existente en ejecución sin detenerlo ni reiniciarlo. Piensa en ello como si abrieras un nuevo terminal dentro de tu contenedor, para poder husmear, ejecutar scripts, comprobar registros o depurar. - docker attach -
docker attach
conecta tu terminal directamente al proceso principal de un contenedor en ejecución. Esto significa que puedes ver la salida en vivo del contenedor (registros, avisos, etc.) e incluso interactuar con él si el proceso acepta entradas.
Solución de problemas comunes
Soluciones sencillas a problemas comunes. He aquí algunos errores comunes durante la ejecución de imágenes Docker y cómo puedes abordarlos.
Error 1: "Respuesta de error del demonio: acceso pull denegado para alpine-python, el repositorio no existe o puede requerir 'docker login': denegado: se deniega el acceso solicitado al recurso".
- Lo que significa: Docker ha intentado extraer una imagen, en este caso la imagen
alpine-python
de Docker Hub, pero la imagen o no existe o es privada, y no estás autenticado. - Cómo arreglarlo:
- Vuelve a comprobar el nombre y la etiqueta de la imagen en Docker Hub.
- Si es una imagen privada, ejecuta
docker login
para autentificarte. - Asegúrate de que la imagen existe si la extraes de un registro personalizado.
Error 2: "No se ha encontrado dicha imagen: <nombre de la imagen>:<etiqueta>"
- Lo que significa: Has intentado ejecutar o etiquetar una imagen localmente, pero la imagen (o la etiqueta especificada) no está disponible en tu sistema.
- Cómo arreglarlo:
- Utiliza
docker images
paracomprobar las imágenes disponibles. - Tira de la imagen explícitamente:
- Utiliza
docker pull <image-name>:<tag>
Error 3: "manifiesto para <imagen>:<etiqueta> no encontrado: manifiesto desconocido: El manifiesto nombrado no es conocido por el registro".
- Lo que significa: Este error se produce probablemente cuando la imagen o etiqueta especificada no existe.
- Posibles soluciones: Estos consejos deberían solucionar la mayoría de los errores comunes:
- Comprueba que la imagen y el nombre de la etiqueta son correctos.
- Consulta las etiquetas de la imagen en Docker Hub o en tu registro personalizado.
- Utiliza
docker pull
para obtener una versión válida.:
- Si construyes localmente, utiliza un
Dockerfile
correcto y construye la imagen con:
docker build -t <image>:<tag> .
Conflictos de puertos y fallos de enlace
Los conflictos de puertos se producen cuando varios contenedores o un contenedor y otra aplicación intentan acceder al mismo puerto.
- Cómo arreglarlo:
- Utiliza un puerto de host diferente cuando ejecutes tu contenedor:
docker run -p 8081:80 <image>
- Detén el servicio que actualmente utiliza el puerto.
- Identifica con qué está utilizando un puerto (por ejemplo, 8080):
lsof -i :8080
Conclusión
Ejecutar una imagen Docker es uno de los pasos más importantes y potentes en el uso de contenedores, tanto si estás poniendo en marcha un simple servidor web como desplegando una aplicación compleja. Con unos pocos comandos como docker run
, docker ps
, y docker stop
, ya estás equipado para lanzar, gestionar y solucionar problemas de contenedores con confianza.
Si estás preparado para ir más allá, prueba a crear tu propia imagen con un Dockerfile, explora las banderas avanzadas de docker run
o aprende a gestionar varios contenedores con Docker Compose.
Echa un vistazo a estos cursos para continuar tu viaje Docker:
- Docker intermedio: Aprende gestión avanzada de imágenes, volúmenes y aplicaciones multicontenedor.
- Conceptos de contenedorización y virtualización: Comprende la teoría que hay detrás de los contenedores y en qué se diferencian de las máquinas virtuales.
- Containerización y virtualización con Docker y Kubernetes: Un programa completo de aprendizaje para dominar Docker e iniciarse en Kubernetes.
Domina Docker y Kubernetes
Preguntas frecuentes
¿Puedo ejecutar varios contenedores desde la misma imagen Docker?
Sí, puedes ejecutar varios contenedores desde la misma imagen. Cada contenedor está aislado y puede tener sus propias configuraciones, puertos y variables de entorno.
¿Cómo paso secretos o claves API de forma segura a un contenedor Docker?
Utiliza la bandera -e
para establecer variables de entorno o utiliza un archivo .env
y --env-file
para pasar secretos en tiempo de ejecución sin codificarlos.
¿Cómo puedo ejecutar una imagen Docker en segundo plano?
Utiliza la bandera -d
con docker run
para iniciar el contenedor en modo separado, permitiendo que el terminal permanezca disponible para otros comandos.
¿Cuál es la diferencia entre docker exec y docker attach?
docker exec
abre una nueva sesión de terminal dentro del contenedor, mientras que docker attach
se conecta al proceso principal del contenedor y a su salida en vivo.
¿Por qué aparece "acceso pull denegado" al ejecutar una imagen?
Esto suele significar que la imagen es privada o está mal escrita. Comprueba el nombre, la etiqueta y asegúrate de que has iniciado sesión en Docker Hub con docker login
.
¿Cómo persisto los datos en un contenedor después de que se detenga?
Utiliza la bandera -v
para montar un volumen, asegurándote de que los datos se almacenan fuera del contenedor y permanecen intactos incluso después de retirar el contenedor.
¿Cuál es la mejor manera de ejecutar un contenedor con fines de desarrollo?
Utiliza las banderas -it
para el modo interactivo, junto con el montaje de volúmenes y las variables de entorno para simular un entorno de desarrollo local.
¿Cómo puedo saber qué puertos están en conflicto en mi máquina?
Utiliza lsof -i :
para identificar qué proceso está utilizando un puerto concreto y, a continuación, deténlo o utiliza un puerto host distinto para tu contenedor.
¿Cómo puedo ver los registros de un contenedor Docker en ejecución?
Utiliza el comando docker logs
para recuperar y revisar los registros de los flujos de salida estándar y de error del contenedor.
Srujana es una redactora técnica autónoma con una licenciatura de cuatro años en Informática. Escribir sobre diversos temas, como la ciencia de datos, la computación en la nube, el desarrollo, la programación, la seguridad y muchos otros, le resulta natural. Le encanta la literatura clásica y explorar nuevos destinos.