Cuando envías tu código al equipo de ingeniería, puede ser frustrante encontrarse con problemas de compatibilidad con diferentes sistemas operativos y versiones de bibliotecas.
Docker puede resolver problemas de compatibilidad entre sistemas operativos y versiones de bibliotecas al enviar código a los equipos de ingeniería, haciendo que la ejecución del código sea fluida sin importar su configuración subyacente.
En este doc
presentaremos los conceptos esenciales de Docker, te guiaremos a través de la instalación, demostraremos su uso práctico con ejemplos, revelaremos las mejores prácticas de la industria y responderemos cualquier pregunta relacionada en el camino. ¡Así que despídete de los problemas de compatibilidad y optimiza tu flujo de trabajo de aprendizaje automático o ingenería de datos con Docker!
Introducción a Docker
Docker vs Contenedores vs Imágenes Docker
Docker es una plataforma comercial de contenedorización y tiempo de ejecución que ayuda a los desarrolladores a crear, desplegar y ejecutar contenedores. Utiliza una arquitectura cliente-servidor con comandos simples y automatización a través de una única API.
Con Docker, los desarrolladores pueden crear aplicaciones contenedorizadas escribiendo un Dockerfile, que es esencialmente una receta para construir una imagen de contenedor. Docker luego proporciona un conjunto de herramientas para construir y gestionar estas imágenes de contenedor, facilitando a los desarrolladores el empaquetado y despliegue de sus aplicaciones de manera consistente y reproducible.
Un contenedor es un paquete de software ejecutable, liviano y portátil que incluye todo lo que una aplicación necesita para ejecutarse, incluyendo código, bibliotecas, herramientas del sistema y configuraciones.
Los contenedores se crean a partir de imágenes que definen el contenido y la configuración del contenedor, y están aislados del sistema operativo host y otros contenedores en el mismo sistema.
Este aislamiento es posible gracias al uso de tecnologías de virtualización y aislamiento de procesos, que permiten a los contenedores compartir los recursos de una sola instancia del sistema operativo host mientras proporcionan un entorno seguro y predecible para la ejecución de aplicaciones.
Una Imagen Docker es un archivo de solo lectura que contiene todas las instrucciones necesarias para crear un contenedor. Se utilizan para crear y empezar nuevos contenedores en tiempo de ejecución.
Importancia de Docker para los Científicos e ingenieros de Datos
Docker permite a los desarrolladores acceder a estas capacidades de contenedorización nativas utilizando comandos simples y automatizarlas a través de una interfaz de programación de aplicaciones (API) que ahorra trabajo. Docker ofrece:
- Portabilidad mejorada y sin problemas de los contenedores: Los contenedores de Docker se ejecutan sin modificaciones en cualquier entorno de escritorio, centro de datos o nube.
- Actualizaciones aún más ligeras y granulares: Se pueden combinar múltiples procesos dentro de un solo contenedor. Esto permite construir una aplicación que puede seguir funcionando mientras una de sus partes se detiene para una actualización o reparación.
- Creación automatizada de contenedores: Docker puede construir automáticamente un contenedor basado en el código fuente de la aplicación.
- Versionado de contenedores: Docker puede rastrear versiones de una imagen de contenedor, revertir a versiones anteriores y rastrear quién construyó una versión y cómo. Incluso puede cargar solo las diferencias entre una versión existente y una nueva.
- Reutilización de contenedores: Se pueden usar contenedores existentes como imágenes base, esencialmente como plantillas para construir nuevos contenedores.
- Bibliotecas de contenedores compartidas: Los desarrolladores pueden acceder a un registro de código abierto que contiene miles de contenedores contribuidos por usuarios.
Comenzando con Docker
Después de presentar Docker, veamos cómo podemos usarlo para nuestros proyectos de ciencia de datos. Primero, comenzaremos con la instalación de Docker en tu máquina local y luego introduciremos los comandos básicos de Docker.
Instalación de Docker en Tu Máquina
Instalar Docker en tu máquina es bastante fácil. Puedes seguir las instrucciones disponibles en la documentación oficial:
- Instrucciones para instalar Docker en Linux.
- Instrucciones para instalar Docker en Windows.
- Instrucciones para instalar Docker en Mac.
Es importante notar que si deseas crear tus propias imágenes y subirlas a Docker Hub, debes crear una cuenta en Docker Hub. Piensa en Docker Hub como un lugar central donde los desarrolladores pueden almacenar y compartir sus imágenes de Docker.
Comandos Básicos de Docker
Una vez que hayas instalado Docker en tu máquina, exploremos algunos de los comandos básicos de Docker que debes conocer.
-
docker run: El comando "docker run" se utiliza para crear y arrancar un nuevo contenedor basado en una imagen Docker. Esta es la sintaxis básica para ejecutar un contenedor:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento del contenedor, como especificar puertos, volúmenes, variables de entorno, etc.
- IMAGE: El nombre de la imagen Docker para usar al crear el contenedor.
- COMMAND: (Opcional) El comando que se ejecutará dentro del contenedor.
- ARG: (Opcional) Argumentos pasados al comando dentro del contenedor.
Por ejemplo, para ejecutar un contenedor basado en la imagen "ubuntu" y ejecutar el comando "ls" dentro del contenedor, usarías el siguiente comando:
docker run ubuntu ls
Esto creará un nuevo contenedor utilizando la imagen "ubuntu" y ejecutará el comando "ls", que lista los archivos y directorios dentro del sistema de archivos del contenedor. Ten en cuenta que si la imagen especificada no está disponible localmente, Docker la descargará automáticamente de un registro Docker antes de crear el contenedor.
-
docker ps: El comando "docker ps" se usa para listar los contenedores en ejecución en tu host Docker. Proporciona información como el ID del contenedor, la imagen utilizada, el comando que se está ejecutando, el estado y las asignaciones de puertos. Esta es la sintaxis básica:
docker ps [OPTIONS]
Por defecto, "docker ps" solo muestra los contenedores en ejecución. Si deseas ver todos los contenedores, incluidos los que están detenidos o salieron, puedes usar la opción "-a":
docker ps -a
-
docker stop: El comando "docker stop" se usa para detener uno o más contenedores en ejecución. Envía una señal al proceso principal del contenedor, solicitándole que se detenga de manera ordenada. Esta es la sintaxis básica:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de detención. Por ejemplo, puedes especificar un período de tiempo de espera con la opción "--time" o "-t" para permitir que el contenedor tenga más tiempo para detenerse de manera ordenada antes de terminarlo a la fuerza.
- CONTAINER: El nombre o ID del contenedor(es) a detener. Puedes especificar varios contenedores separados por espacios.
Por ejemplo, para detener un contenedor con el nombre "mi-contenedor", usarías el siguiente comando:
docker stop mi-contenedor
-
docker rm: El comando "docker rm" se usa para eliminar uno o más contenedores detenidos de tu host Docker. Elimina permanentemente el contenedor(es)
especificado(s) y libera cualquier recurso asociado. Esta es la sintaxis básica:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de eliminación. Por ejemplo, puedes usar la opción "-f" o "--force" para forzar la eliminación de un contenedor en ejecución.
- CONTAINER: El nombre o ID del contenedor(es) a eliminar. Puedes especificar varios contenedores separados por espacios.
Por ejemplo, para eliminar un contenedor con el nombre "mi-contenedor", usarías el siguiente comando:
docker rm mi-contenedor
-
docker images: El comando "docker images" se usa para listar todas las imágenes disponibles en tu host Docker. Proporciona información sobre cada imagen, como el nombre del repositorio, la etiqueta, el ID de la imagen, la fecha de creación y el tamaño. Esta es la sintaxis básica:
docker images [OPTIONS] [REPOSITORY[:TAG]]
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento del comando. Por ejemplo, puedes usar la opción "-a" o "--all" para mostrar todas las imágenes (incluidas las intermedias).
- REPOSITORY[:TAG]: (Opcional) Especifica un repositorio y una etiqueta para filtrar los resultados. Si solo se proporciona el repositorio, se mostrarán todas las etiquetas asociadas.
Por ejemplo, para listar todas las imágenes en tu host Docker, usarías el siguiente comando:
docker images
-
docker rmi: El comando "docker rmi" se usa para eliminar una o más imágenes de tu host Docker. Elimina permanentemente las imágenes especificadas y libera cualquier espacio en disco asociado. Esta es la sintaxis básica:
docker rmi [OPTIONS] IMAGE [IMAGE...]
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de eliminación. Por ejemplo, puedes usar la opción "-f" o "--force" para forzar la eliminación de una imagen en uso por un contenedor.
- IMAGE: El nombre o ID de la imagen(es) a eliminar. Puedes especificar varias imágenes separadas por espacios.
Por ejemplo, para eliminar una imagen con el nombre "mi-imagen", usarías el siguiente comando:
docker rmi mi-imagen
-
docker build: El comando "docker build" se usa para construir una imagen Docker a partir de un Dockerfile y un contexto de construcción. Crea una nueva imagen ejecutando las instrucciones especificadas en el Dockerfile. Esta es la sintaxis básica:
docker build [OPTIONS] PATH | URL | -
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de construcción. Por ejemplo, puedes usar la opción "-t" o "--tag" para asignar una etiqueta a la imagen construida.
- PATH | URL | -: Especifica la ubicación del Dockerfile y el contexto de construcción. Puede ser una ruta local, una URL o "-" para leer desde la entrada estándar (stdin).
Por ejemplo, para construir una imagen desde un Dockerfile en el directorio actual y asignarle una etiqueta "mi-imagen", usarías el siguiente comando:
docker build -t mi-imagen .
-
docker pull: El comando "docker pull" se usa para descargar una imagen desde un registro Docker (como Docker Hub) a tu host Docker. Recupera la imagen especificada y cualquier capa dependiente de la imagen desde el registro. Esta es la sintaxis básica:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de la descarga.
- NAME[:TAG|@DIGEST]: Especifica el nombre de la imagen a descargar. Puedes proporcionar una etiqueta (TAG) o un digest (DIGEST) opcional para una versión específica de la imagen.
Por ejemplo, para descargar la imagen "ubuntu:latest" desde Docker Hub, usarías el siguiente comando:
docker pull ubuntu:latest
-
docker push: El comando "docker push" se usa para subir una imagen desde tu host Docker a un registro Docker (como Docker Hub). Transfiere la imagen especificada y cualquier capa dependiente de la imagen al registro. Esta es la sintaxis básica:
docker push [OPTIONS] NAME[:TAG]
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de la carga.
- NAME[:TAG]: Especifica el nombre de la imagen a cargar. Puedes proporcionar una etiqueta (TAG) opcional para una versión específica de la imagen.
Por ejemplo, para subir la imagen "mi-imagen:latest" a Docker Hub, usarías el siguiente comando:
docker push mi-imagen:latest
-
docker exec: El comando "docker exec" se usa para ejecutar un comando en un contenedor en ejecución. Te permite interactuar con el contenedor y ejecutar comandos adicionales dentro de él. Esta es la sintaxis básica:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de la ejecución. Por ejemplo, puedes usar la opción "-it" para ejecutar el comando en modo interactivo y adjuntar una terminal (TTY).
- CONTAINER: El nombre o ID del contenedor en el que se ejecutará el comando.
- COMMAND: El comando a ejecutar dentro del contenedor.
- ARG: (Opcional) Argumentos pasados al comando dentro del contenedor.
Por ejemplo, para ejecutar el comando "bash" dentro de un contenedor en ejecución llamado "mi-contenedor" en modo interactivo, usarías el siguiente comando:
docker exec -it mi-contenedor bash
Dockerizando una Aplicación
Ahora que hemos cubierto los conceptos básicos de Docker y los comandos esenciales, pasemos a un ejemplo práctico de cómo puedes Dockerizar una aplicación. En esta sección, te guiaremos a través de los pasos para definir el entorno, escribir un Dockerfile y construir la imagen de Docker.
Definir el entorno
Antes de Dockerizar tu aplicación, es esencial definir el entorno necesario para ejecutarla. Esto incluye las bibliotecas y dependencias que necesitas. Por ejemplo, supongamos que tienes una aplicación de aprendizaje automático o ingeniería de datos en Python que requiere las siguientes bibliotecas:
- NumPy
- Pandas
- Scikit-learn
Puedes definir tus dependencias en un archivo llamado requirements.txt
. Aquí tienes un ejemplo de cómo podría verse:
numpy
pandas
scikit-learn
Escribir un Dockerfile
El siguiente paso es escribir un Dockerfile, que es un archivo de texto con instrucciones para construir una imagen de Docker. Aquí tienes un ejemplo de un Dockerfile para nuestra aplicación de aprendizaje automático:
# Utilizar una imagen base oficial de Python
FROM python:3.8-slim
# Establecer el directorio de trabajo en el contenedor
WORKDIR /app
# Copiar el archivo requirements.txt al directorio de trabajo
COPY requirements.txt .
# Instalar las dependencias
RUN pip install --no-cache-dir -r requirements.txt
# Copiar el resto de la aplicación al directorio de trabajo
COPY . .
# Especificar el comando por defecto que se ejecutará al iniciar el contenedor
CMD ["python", "tu_script_de_aprendizaje_automatico.py"]
Construir la Imagen
Con el Dockerfile definido, puedes construir la imagen de Docker utilizando el comando docker build
. Asegúrate de estar en el mismo directorio donde se encuentra el Dockerfile. Usa el siguiente comando para construir la imagen:
docker build -t mi-app-ml .
Aquí, -t mi-app-ml
asigna una etiqueta a la imagen para identificarla fácilmente más tarde. El .
al final del comando especifica que Docker debe usar el Dockerfile en el directorio actual.
Una vez que la imagen se haya construido correctamente, puedes ejecutarla en un contenedor utilizando el comando docker run
:
docker run mi-app-ml
¡Y eso es todo! Has Dockerizado con éxito tu aplicación de aprendizaje automático o ingeniería de datos y ahora puedes ejecutarla en cualquier entorno que soporte Docker sin preocuparte por problemas de compatibilidad.