GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo Dockerizar Aplicaciones Python Con Miniconda [Un Enfoque Híbrido]

Si está familiarizado con Docker, probablemente sepa que puede crear una imagen de docker personalizada utilizando Dockerfile. He escrito sobre en detalles.

Cómo crear una imagen de Docker personalizada con Dockerfile [muy fácil] El verdadero poder de Docker radica en ajustar la imagen base de Docker según sus requisitos. Con eso, puede implementar fácil y rápidamente un entorno Linux personalizado ejecutando un contenedor desde esa imagen de Docker personalizada. Manual de LinuxAvimanyu Bandyopadhyay

En este tutorial, le mostraré cómo seguir la misma idea pero solo para aplicaciones de Python. Esto será útil tanto para los usuarios como para los desarrolladores.

Usaré una imagen mínima de Python. Una vez que haya modificado y revisado esa imagen, ya no tendrá que preocuparse por instalar su aplicación Python en diferentes sistemas operativos. Podrá ejecutar inmediatamente su aplicación Python con Docker cada vez. ¡Entonces, puede despedirse de esos contratiempos de instalación basados ​​​​en host!

Creando una imagen de docker para su aplicación de Python

Voy a usar Miniconda aquí. Miniconda es un instalador mínimo y gratuito para conda y le brinda una versión pequeña y de arranque de Anaconda con solo las necesidades básicas que necesita para ejecutar aplicaciones de Python.

¿Por qué Miniconda?

Hay más de una razón:

Cuando instala Miniconda en un host, en realidad no está utilizando la versión de Python proporcionada por el administrador de paquetes del sistema operativo. Miniconda se instala en una ubicación separada que tiene su propio entorno de Python. Por lo tanto, esto le brinda un nivel adicional de aislamiento cuando se realiza en un contenedor Docker.

Debido al punto anterior, también obtienes otra ventaja:ya que estás usando conda que instaló Miniconda, puede usar esta herramienta para cambiar la versión relevante de Python de su aplicación cuando sea necesario. Esta es una gran ayuda para los desarrolladores de aplicaciones basadas en diferentes versiones de Python 3:podrían ser 3.6, 3.7, 3.8, 3.9 o versiones anteriores también.

Por ejemplo, si de forma predeterminada está ejecutando Python 3.9 pero su aplicación de Python requiere Python 3.7 debido a las dependencias relevantes, ¿qué haría?

Aquí es donde conda puedo ayudarte. Con él, puede ejecutar conda install python=3.7 para cambiar la versión de Python requerida instalándola con todas las dependencias necesarias.

  • Miniconda le permite instalar aplicaciones Python 2 y Python 3. Aunque Python 2 está oficialmente muerto, aún puede probar aplicaciones antiguas sobre este entorno sin necesidad de auditar su nuevo puerto de Python 3 con 2to3.
  • También hay muchos casos de uso en los que una aplicación de Python que se ejecuta en Miniconda busca dependencias del lado del host que no sean de Python (por ejemplo, g++ ). ¡Aquí es cuando el poder combinado de Miniconda y Docker se convierte en una gran solución!
  • ¿Olvidé mencionar que también puede crear y activar sus propios entornos de aplicaciones de Python con conda? ? ¡Aislamiento de nuevo!
  • En cualquier momento, siempre tiene la opción de cambiar entre la versión de Python predeterminada del contenedor Docker y la de Miniconda. Esto le brinda más flexibilidad, ya que siempre puede reconstruir una nueva imagen con el cambio cuando lo desee.

Entonces, ¡continuemos ahora con la creación de la nueva imagen de la aplicación Python con Miniconda y Docker!

Requisito previo

Si aún no lo ha hecho, instale Docker en Ubuntu o en la distribución de Linux que esté utilizando. Asegúrese de agregarse al grupo docker para que pueda ejecutar docker sin sudo. Necesitará una conexión a Internet activa para descargar la imagen base de la ventana acoplable.

Para una aplicación Python de muestra, estoy usando un simple "¡Hola mundo!" ejemplo llamado python-app.py para que le resulte más fácil entender cómo ejecutarlo a través de Miniconda en Docker.

Una aplicación completa de Python que use diferentes bibliotecas de Python se beneficiaría enormemente del mismo procedimiento, especialmente debido a las diversas disposiciones de dependencia de Miniconda.

Paso 1:Obtenga la imagen de Docker [opcional]

Elegí Python Slim en este ejemplo en lugar de Alpine Linux. Este último es realmente pequeño pero puede afectar en gran medida el rendimiento cuando se trata de ejecutar aplicaciones. Sin embargo, Python Slim tiene un tamaño aproximado de 40 MB, basado en Debian Buster y Python 3.9.1.

Este paso es opcional. Lo incluí para mostrar que puede compararlo con la imagen de la aplicación python personalizada como en el tutorial anterior de Dockerfile.

Extraiga la última imagen de la ventana acoplable de Python Slim con docker pull comando:

docker pull python:slim

Paso 2:Crear Dockerfile con la personalización necesaria

Ahora vamos a crear un nuevo archivo vacío llamado Dockerfile usando el comando táctil. Pero primero cree un directorio para su aplicación acoplable.

mkdir python-docker
cd python-docker
touch Dockerfile

Adjuntaré el Dockerfile completo a continuación una vez que haya terminado de explicar los pasos dentro del proceso de creación de imágenes a través de un recorrido paso a paso del archivo.

Aquí se explica cómo comenzar y progresar en la creación de la imagen:

Preparar la imagen base

Actualice los últimos paquetes predeterminados utilizando Python Slim como imagen base.

FROM python:slim
RUN apt-get update && apt-get -y upgrade \

Instalar dependencias de paquetes que no sean de Python

Instale cualquier dependencia que no sea de Python para su aplicación de Python (por ejemplo, g++ y cualquier otro según sus requisitos).

  && apt-get install -y --no-install-recommends \
    git \
    wget \
    g++ \
    gcc \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

Git y Wget pueden ser muy útiles para obtener aplicaciones de Python de diferentes repositorios y URL. Finalmente, limpie algo de espacio con rm -rf /var/lib/apt/lists/* para minimizar el tamaño final de la imagen de Docker.

Instalar Miniconda

Una vez instalado, Miniconda actualiza .bashrc para cambiar a su propia versión de Python.

ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && mkdir /root/.conda \
    && bash Miniconda3-latest-Linux-x86_64.sh -b \
    && rm -f Miniconda3-latest-Linux-x86_64.sh \

Aquí se establece una variable de entorno dentro de la ruta del sistema del contenedor. ENV está destinado a los contenedores que ejecutará en la imagen y ARG está destinado a los contenedores intermedios que se crean mientras se construye por primera vez.

Entonces, la diferencia entre ENV y ARG instrucciones en el bloque de código anterior es que este último solo está disponible mientras se construye la imagen. Mira esta hermosa explicación aquí.

Con wget , descargue la última versión de Miniconda del repositorio oficial de Anaconda. Después de crear el directorio de configuración esencial, instálelo y finalmente elimine el instalador.

Configurar Miniconda para Bash Shell

Después de instalar Miniconda, muestre su número de versión para confirmarlo e inicialícelo en el shell de Bash para el contenedor . La segunda línea actualiza su .bashrc predeterminado archivo:

	&& echo "Running $(conda --version)" && \
    conda init bash && \

Recargar Bash con los nuevos cambios

Vuelva a cargar Bash para que el sistema de compilación de Docker cambie a la versión Miniconda Python en lugar de Debian (la imagen base del sistema operativo).

	. /root/.bashrc && \

Además, actualice los paquetes Miniconda actuales incluidos de forma predeterminada.

	conda update conda && \

Prepare un entorno Conda para su aplicación

Cree y active un entorno Conda separado para su aplicación Python.

    conda create -n python-app && \
    conda activate python-app && \

Instale la versión de Python relevante que necesita para su aplicación. Suponiendo que su aplicación esté basada en Python 3.6, configure esta versión dentro del nuevo entorno virtual junto con Pip, que también es muy útil para administrar aplicaciones de Python.

    conda install python=3.6 pip && \

Instalar su aplicación Python

Dependiendo de cómo use su aplicación, puede:

i. Instálelo con pip que convencionalmente usa el setup.py archivo disponible en su repositorio. Es la misma herramienta discutida anteriormente, pero aquí la estoy usando a través de Conda.

	git clone replace-me-with-repo-url
	cd repo-name
	pip install -e .

ii. ..o ejecutarlo directamente con python comando:

	git clone replace-me-with-repo-url
	cd repo-name
	python python-app.py

En el Dockerfile de demostración, voy a usar "¡Hola mundo!" ejemplo para que le resulte más fácil comprender cómo puede ejecutarlo directamente iniciando un contenedor o dentro de su shell bash con Docker. Entonces, digamos que estoy usando la segunda forma:

    echo 'print("Hello World!")' > python-app.py

Ahora que he incluido la línea anterior, un archivo llamado python-app.py se crea que se supone que genera el mensaje Hello World cada vez que lo ejecuta con el comando python python-app.py .

Actualiza el archivo .bashrc para tu aplicación como lo hace Miniconda:

El instalador de Miniconda actualiza automáticamente el archivo .bashrc después de ejecutar conda init bash como se muestra anteriormente. También puede hacer lo mismo para su aplicación de Python. Cada vez que ejecute el contenedor bash, el entorno se activará y también puede usar el nombre de su aplicación de Python como comando para ejecutarlo. Aquí he usado el nombre como python-app :

RUN echo 'conda activate python-app \n\
alias python-app="python python-app.py"' >> /root/.bashrc

Preparar la aplicación para la ejecución final

Finalmente, creo un punto de entrada y asigno el comando que le permitirá ejecutarlo cada vez que ejecute un contenedor basado en esta imagen:

ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

Archivo Docker completo

Puedes usar un editor como Vim o Nano o usar el cat Comando para agregar las líneas discutidas anteriormente al Dockerfile.

FROM python:slim
RUN apt-get update && apt-get -y upgrade \
  && apt-get install -y --no-install-recommends \
    git \
    wget \
    g++ \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*
ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && mkdir /root/.conda \
    && bash Miniconda3-latest-Linux-x86_64.sh -b \
    && rm -f Miniconda3-latest-Linux-x86_64.sh \
    && echo "Running $(conda --version)" && \
    conda init bash && \
    . /root/.bashrc && \
    conda update conda && \
    conda create -n python-app && \
    conda activate python-app && \
    conda install python=3.6 pip && \
    echo 'print("Hello World!")' > python-app.py
RUN echo 'conda activate python-app \n\
alias python-app="python python-app.py"' >> /root/.bashrc
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

Cuando pruebe su propia aplicación, reemplace echo 'print("Hello World!")' > python-app.py línea anterior con cualquiera de las dos formas descritas en Instalar su aplicación Python sección anterior.

Paso 3:Cree la imagen de la aplicación Python con Dockerfile

Como ya sabrá, el comando para crear la imagen de Docker modificada a partir de Dockerfile tiene el siguiente aspecto:

docker build -t python-app PATH_to_Dockerfile

Con la etiqueta -t, especifica el nombre de la imagen Docker de su aplicación. Lo configuré como python-app en el comando de ejemplo anterior.

Teniendo en cuenta que Dockerfile está en su directorio actual, puede crear la nueva imagen de Docker de su aplicación de Python de esta manera:

docker build -t python-app .
[email protected]:~/python-docker$ docker build -t python-app .
Sending build context to Docker daemon   2.56kB
Step 1/8 : FROM python:slim
 ---> 677f7ac99e48
Step 2/8 : RUN apt-get update && apt-get -y upgrade   && apt-get install -y --no-install-recommends     git     wget     g++     ca-certificates     && rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 15ee9c47c83b
Step 3/8 : ENV PATH="/root/miniconda3/bin:${PATH}"
 ---> Using cache
 ---> cfd5ed6b5ec9
Step 4/8 : ARG PATH="/root/miniconda3/bin:${PATH}"
 ---> Using cache
 ---> e70d06b5ff10
Step 5/8 : RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh     && mkdir /root/.conda     && bash Miniconda3-latest-Linux-x86_64.sh -b     && rm -f Miniconda3-latest-Linux-x86_64.sh     && echo "Running $(conda --version)" &&     conda init bash &&     . /root/.bashrc &&     conda update conda &&     conda create -n python-app &&     conda activate python-app &&     conda install python=3.6 pip &&     echo 'print("Hello World!")' > python-app.py
 ---> Using cache
 ---> 8a7957a6abb2
Step 6/8 : RUN echo 'conda activate python-app \nalias python-app="python python-app.py"' >> /root/.bashrc
 ---> Running in e3193e93b631
Removing intermediate container e3193e93b631
 ---> 948f45eb6024
Step 7/8 : ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
 ---> Running in 621624951dcf
Removing intermediate container 621624951dcf
 ---> 6e8824889502
Step 8/8 : CMD ["python python-app.py"]
 ---> Running in dc97f9d0d8fe
Removing intermediate container dc97f9d0d8fe
 ---> 01bae0a9903c
Successfully built 01bae0a9903c
Successfully tagged python-app:latest

El resultado anterior se basa en datos almacenados en caché, pero cuando lo ejecuta por primera vez, tardará algún tiempo y producirá un resultado de registro mucho más largo.

Ahora, verifiquemos que su imagen de Docker modificada tenga instalada la aplicación de ejemplo ejecutando un contenedor desde ella:

docker run python-app
[email protected]:~/python-docker$ docker run python-app
Hello World!

Entonces, a través de Docker y Miniconda, ¡ahora puede ejecutar el programa directamente sin necesidad de una instalación previa! De ahora en adelante, todo lo que necesitas es la imagen.

Ingresemos ahora al shell bash dentro de este contenedor:

docker run -ti python-app bash
[email protected]:~/python-docker$ docker run -ti python-app bash
(python-app) [email protected]:/# 

Como puede ver, ahora está dentro del entorno activado de Conda que creó anteriormente a través del Dockerfile. El -ti flag se utiliza para crear un terminal interactivo para usted. Ahora puede usar alternativamente el comando que creó para ejecutar la aplicación:

(python-app) [email protected]:/# python-app
Hello World!

Confirmemos también que efectivamente está utilizando la versión Miniconda Python y no la versión predeterminada de Python:

(python-app) [email protected]:/# python --version
Python 3.6.12 :: Anaconda, Inc.

Como mencioné anteriormente, Miniconda es una versión en miniatura de Anaconda.

Una vez que haya configurado todo, puede enviar su imagen final a Docker Hub si aloja una aplicación Python de código abierto en GitHub, GitLab, Gitea, Bitbucket o cualquier otro repositorio.

Salga del contenedor escribiendo exit en la terminal. Detenga el contenedor, elimine el contenedor y elimine las imágenes de Docker (si lo desea) para liberar espacio en disco.

¡Felicitaciones! Acaba de aprender a crear su propia imagen de Docker para su aplicación de Python.

¿Fue útil para usted?

Como puede ver, Miniconda no solo lo ayuda a hacer que su aplicación sea más flexible y preparada para el futuro a nivel de usuario, sino que también facilita mucho el papel del desarrollador.

¡Piense en lo conveniente que sería configurar esto con PyCharm! Instala Miniconda y su aplicación de Python como lo hace en un sistema host, pero dado que lo compila y lo guarda como una imagen de Docker, ¡se convierte en un proceso de una sola vez!

Si lo desea, puede experimentar con los diferentes ejemplos que se muestran en este tutorial anterior en lugar del "¡Hola mundo!" ejemplo que he usado en este.

¡Espero que esto ayude! Si tiene preguntas o sugerencias, deje un comentario a continuación.


Docker
  1. Cómo instalar y alojar un servidor OpenVPN con Docker

  2. Cómo instalar Jenkins con Docker

  3. Cómo implementar un contenedor nginx con Docker en Linode

  4. Cómo compartir imágenes de Docker con otros

  5. Cómo dockerizar aplicaciones de Python con Miniconda

Cómo reemplazar Docker con Podman en una Mac

Cómo implementar pilas de Docker Compose en Kubernetes con Kompose

Cómo proteger el socket TCP de Docker con TLS

Cómo implementar una aplicación API de Python Flask en Docker

Cómo copiar archivos con Docker cp a su Docker Container

Cómo crear una imagen Docker personalizada con Dockerfile