Imagen fuente de Python
Fuente | Blog de CSDN
Si quieres comprender realmente Docker, debes comenzar con el desarrollo de la tecnología de virtualización. En general, se cree que la tecnología de virtualización ha pasado por la era de las máquinas físicas y las máquinas virtuales y ahora ha entrado en la era de la contenedorización. Se puede decir que Docker es el resultado inevitable del desarrollo continuo de la tecnología de virtualización.
Entonces, ¿qué es un contenedor? ¿Cuál es la diferencia entre contenedores y máquinas virtuales? ¿Cuál es la relación entre Docker y contenedor? Después de comprender estos problemas, el concepto de Docker quedará claro.
1.1 Máquinas virtuales y contenedores
Con la ayuda de software como VMWare, se pueden crear varias máquinas virtuales en una computadora. Cada máquina virtual tiene un sistema operativo independiente y se puede utilizar. Ejecute el programa de forma independiente. Aunque esta tecnología de separación tiene un alto grado de aislamiento (nivel de sistema operativo) y facilidad de uso (similar a una computadora física), sus deficiencias también son obvias, como consumir muchos recursos de almacenamiento (nivel de GB) y una velocidad de inicio lenta. (nivel de minutos).
En comparación con las máquinas virtuales, los contenedores son una tecnología de virtualización liviana que virtualiza el entorno de ejecución más simple (similar a una zona de pruebas) en lugar del sistema operativo y tiene una velocidad de inicio rápida (segundos), menos recursos de almacenamiento. (nivel KB o nivel MB) y aislamiento a nivel de proceso entre contenedores. Se pueden ejecutar miles de contenedores en una sola computadora, lo cual es la ventaja continua de la tecnología de contenedores sobre las máquinas virtuales.
1.2 Contenedores, Mirrors y Docker
Docker es un motor de contenedores de aplicaciones de código abierto que puede crear contenedores y programas que se ejecutan en base a contenedores. Docker permite a los desarrolladores empaquetar sus aplicaciones y dependencias en un contenedor liviano y portátil y luego publicarlo en cualquier máquina Linux popular, que también se puede virtualizar.
Suena simple, pero hay un concepto de duplicación oculto entre Docker y el contenedor, lo que confunde bastante a los principiantes. Una imagen de Docker es esencialmente un sistema de archivos especial que proporciona programas, bibliotecas, recursos, configuración y otros archivos necesarios para que se ejecute el contenedor. Una imagen de Docker es similar a un archivo py y requiere el tiempo de ejecución de Docker (similar al intérprete de Python) para ejecutarse. Cuando ejecuta una imagen, se crea una instancia de la imagen y una instancia es un contenedor.
1.3 Docker y k8s
Como motor de contenedores, Docker proporciona un estándar abierto para aplicaciones en contenedores, lo que permite a los desarrolladores administrar la infraestructura de la misma manera que las aplicaciones e implementar entregas, pruebas y despliegue de código. Con el uso generalizado de contenedores, surgió el problema de cómo coordinar, programar y administrar contenedores, y surgió la programación de contenedores de Docker.
K8s es el motor de orquestación de contenedores de código abierto de Google, que admite implementación automática, escalabilidad a gran escala y gestión de contenedores de aplicaciones. Es de código abierto y se utiliza para administrar aplicaciones en contenedores en múltiples hosts en una plataforma en la nube. El objetivo de k8s es hacer que la implementación de aplicaciones en contenedores sea simple y eficiente. k8s proporciona un mecanismo para la implementación, planificación, actualización y mantenimiento de aplicaciones.
Tanto Docker como k8sr utilizan un estándar en contenedores como tiempo de ejecución, por lo que las imágenes creadas por Docker se pueden usar en k8s sin ningún obstáculo.
2.1 instalado en ubuntu
Instalar Docker en un sistema Linux es muy sencillo. El funcionario nos proporciona un script de instalación con un solo clic. Este método también funciona en distribuciones como Debian o CentOS.
No se desanime si el proceso de instalación se agota. Inténtalo unas cuantas veces y siempre lo conseguirás. Una vez instalado, Docker solo puede ser utilizado por el usuario root. Puede eliminar las restricciones de permisos usando el siguiente comando:
Luego, reinicie el servicio Docker:
Finalmente, simplemente cierre la línea de comando actual y vuelva a abrir la nueva línea de comando.
Por cierto, si lo instalas en CentOS, es posible que obtengas un montón de errores similares a los siguientes:
Esto se debe a conflictos entre Docker y Podman, por lo que necesitas Primero desinstale Podman:
2.2 Instalación en win 10
El funcionamiento de Docker depende del entorno Linux.
Docker Desktop para Windows se proporciona oficialmente, pero es necesario instalar Hyper-V. Hyper-V es una máquina virtual desarrollada por Microsoft, similar a VMWare o VirtualBox, y solo está disponible para Windows 10. Una vez que esta máquina virtual esté habilitada, QEMU, VirtualBox o VMWare Workstation 15 e inferiores no estarán disponibles. Si debe usar otras máquinas virtuales en su computadora (como el emulador necesario para desarrollar aplicaciones de Android), ¡no use Hyper-V!
Mi computadora es Win10 Home Edition y no puedo instalar Hyper-V directamente. Necesito guardar el siguiente comando en un archivo cmd:
Luego haga clic derecho en el archivo cmd y seleccione ejecutar por administrador. Se reiniciará después de la ejecución y la instalación se realizará durante el proceso de reinicio.
2.3 Hola mundo
Después de iniciar el servicio Docker, ejecute el siguiente comando:
El significado de este comando es:
Primero ejecutar En este momento, dado que no hay una imagen de ubuntu:20.04 localmente, Docker la descargará automáticamente desde el servidor de imágenes. El proceso de descarga puede tardar varios intentos. Siempre que tenga éxito una vez, no será necesario descargarlo en el futuro.
Docker proporciona oficialmente la imagen de hello-world, que se puede ejecutar directamente:
Este comando omite la versión de la imagen y los parámetros de ejecución de Docker utilizan la última versión, que es la más reciente. versión.
En el ejemplo de Hola mundo, también podemos experimentar que la instancia de Docker se ejecuta muy rápido.
La biblioteca de imágenes oficial de Docker es lenta. Antes de realizar la duplicación, debe configurar la fuente de la duplicación en un sitio doméstico.
Cree un nuevo archivo /etc/docker/daemon.json e ingrese el siguiente contenido:
Luego reinicie el servicio Docker:
3.1 enumera todos los espejos locales .
Ejecute el comando de visualización de imágenes de la ventana acoplable.
Actualmente, sólo tengo dos imágenes instaladas localmente.
3.2 Encuentra la imagen en la biblioteca de imágenes.
Ejecute el comando docker search image name para buscar imágenes en la biblioteca de imágenes de Docker.
Lo mejor es elegir la imagen oficial, que es la más estable.
3.3 Descargar una nueva imagen
Ejecute el comando docker pull image name:número de versión para descargar una nueva imagen.
Después de descargar la imagen, puedes usarla para crear un contenedor.
4.1 Iniciar el contenedor
Ejecute el comando docker run para iniciar el contenedor, que consiste en crear una instancia espejo. Los comandos de ejecución de Docker son muy complejos. Primero puede ejecutar docker run help para ver la ayuda:
Por ejemplo, si queremos ejecutar el shell de Python, debemos agregar el parámetro -it, es decir: docker run -it python:3.8 .
4.2 Montar los archivos del host en el contenedor.
Los contenedores Docker están aislados del host. Para que el programa en el contenedor acceda a los archivos en el host, los archivos en el host deben montarse en el contenedor mediante el parámetro -v.
Por ejemplo, tenemos un hello.py en el host, que puede imprimir hola. Si queremos ejecutarlo en un contenedor de Python, debemos montarlo. Después de -v, se deben seguir dos parámetros, a saber, el directorio del host y el directorio en el contenedor. Ambos están separados y el camino debe ser absoluto.
Mi hello.py se guarda en el directorio /docker_test del directorio principal. Este directorio se monta en el directorio /docker_test del contenedor y luego ejecuta python /docker_test/hello.py en el contenedor:
4.3 Mapeo de puertos de contenedor
Modifiquemos hello.py, creemos un servidor de socket y escuchemos en el puerto 5000.
Cuando un cliente se conecta, imprima la dirección del cliente. Primero, el cliente envía un saludo y luego cierra la conexión:
Ejecutar en el contenedor:
A continuación, intento conectarme usando el comando telnet, pero el resultado falló. La razón es que 127.0.0.1 es la dirección IP del host y 5000 es el puerto del contenedor, lo cual es ligeramente diferente de nuestros hábitos. De hecho, los contenedores Docker son muy livianos y no tienen red propia. Si desea acceder al puerto del contenedor, debe asignar el puerto del contenedor al puerto del host. Cuando el cliente se conecta, solo necesita conectarse al puerto del host.
Cabe señalar que el cliente no puede conectar el servidor creado por el código anterior de todos modos, porque la IP de 127.0.0.1 está vinculada al código. Cuando se ejecuta en un contenedor, todas las IP deben estar vinculadas, que es 0.0.0.
Luego, use el parámetro -p. -p también requiere tres parámetros, a saber, la dirección IP del host, el puerto del host y el puerto del contenedor, que están separados por:. Generalmente, puede omitir la dirección IP del host y solo escribir el puerto del host: el puerto del contenedor.
De esta manera, el puerto 5000 del contenedor se asigna al puerto 5001 del host, usando:
Puede conectarse al servidor en el contenedor.
4.4 Gestión de contenedores
Después de ejecutar los servicios anteriores, puede utilizar el comando docker ps para ver los contenedores en ejecución:
El contenido mostrado incluye lo siguiente columnas:
Para finalizar un contenedor, puede utilizar el comando ID de contenedor de Dockerkell.
En términos generales, una vez desarrollado nuestro programa, se convertirá en una nueva imagen junto con los archivos del programa y el entorno operativo.
Para crear una imagen, necesitas escribir un Dockerfile. DockeFile consta de varios comandos. Los comandos más utilizados son:
Tenga en cuenta que existe un concepto de capa en la imagen de Docker. Cada vez que se ejecuta el comando de ejecución, se crea una capa. Demasiadas capas harán que aumente el tamaño del archivo de imagen. Intente utilizar & & amp para conectar varios comandos de shell para reducir la cantidad de comandos RUN, lo que puede reducir efectivamente el tamaño del archivo de imagen.
5.1 Visualización propia del espejo del contenido del archivo de texto
Escriba cat.py, reciba un nombre de archivo, use Python para leer el archivo y mostrar el contenido del archivo:
Este ejemplo es relativamente simple. La abreviatura Dockerfile es la siguiente:
El significado de este Dockerfile es:
Cabe señalar que hay dos formas de escribir ENTRYPOINT. :
Aquí utilizamos la segunda forma de escritura porque tenemos que pasar parámetros al contenedor desde fuera. Ejecute el comando para compilar la imagen de Docker:
El -t en este comando significa el destino, es decir, la imagen generada se llama hola y el número de versión es 1.0. No olvides el último. Esto se llama ruta de contexto y significa que Docker está creando la imagen y, a veces, quiere usar archivos en esta máquina (como copiar). Una vez que el comando Docker Build conozca esta ruta, empaquetará todo en esta ruta.
Con esto, nuestra primera imagen está completa y podemos ejecutarla con el siguiente comando:
Puedes ver el contenido ~/docker_test/cat/files/txt.
5.2 Imagen de servidor web casera
Usamos tornado para desarrollar un sitio web, pero la imagen oficial de Python no tiene la biblioteca tornado y debe instalarse al crear la imagen.
El ws.py probado se ve así:
Escribe el Dockerfile de la siguiente manera:
Aquí verificamos la diferencia entre CMD y ENTRYPOINT. Ejecute el siguiente comando en el directorio donde se encuentra Dockerfile:
Una vez completada la ejecución, puede usar imágenes de Docker para ver la imagen generada y luego ejecutarla usando el siguiente comando:
Ingrese en el navegador. Puede ver la página verificando la dirección IP del host y el puerto 8000.
En este ejemplo, el comando de ejecución que uso es CMD.
Si se especifican otros comandos en Docker Run, el comando no se ejecutará, por ejemplo:
En este momento, el comando de Python se ejecuta en el contenedor, no en nuestro servicio. En más casos, queremos pasar parámetros para nuestro servicio en el comando de ejecución de Docker en lugar de anular el comando de ejecución, por lo que debemos usar ENTRYPOINT en lugar de CMD:
El método de escritura anterior no admite el paso de parámetros. ENTRYPOINT y CMD también admiten otro método de escritura:
De esta manera, los parámetros del comando docker run se pueden pasar a hello.py:
En este comando, - puerto=9000 as Los argumentos se pasan a hello.py para que el puerto en el contenedor sea 9000.
Cuando se ejecuta en un entorno de producción, no use la opción -it, pero use la opción -d para hacer que el contenedor se ejecute en segundo plano:
De esta manera, incluso si el La consola actual está cerrada, el contenedor no se detendrá.
5.3 Imagen de servicio de programación hecha por usted mismo
A continuación, cree una imagen de servicio escrita por apscheduler. El código es el siguiente:
Dockerfile también es muy conveniente:
Construye la imagen:
Debería estar lista para ejecutarse. Se requieren dos directorios para copiar archivos. En tiempo de ejecución, puedes usar -v dos veces para montar directorios diferentes:
El tamaño de la imagen oficial de Python utilizada antes era de 882 MB. Sobre esta base, al instalar bibliotecas de terceros y agregar los recursos necesarios para el proyecto, el tamaño de la imagen oficial de Python puede superar fácilmente 1 G. Es muy inconveniente transmitir imágenes tan grandes a los clientes a través de la red. Por tanto, reducir el tamaño de la imagen es muy necesario.
Hay una imagen python:3.8-alpine en Docker Hub, que tiene un tamaño de solo 44,5 MB. La razón por la que es pequeña es que Alpine es un sistema operativo con arquitectura de caja ocupada y generalmente se usa para aplicaciones integradas. . Intenté usar esta imagen y descubrí que estaba bien instalar bibliotecas generales, pero era difícil instalar numpy y similares, y ni siquiera pude encontrar una solución en línea.
Volvamos a lo básico. Para las imágenes del sistema operativo convencional, el tamaño de ubuntu es 72,9 MB y el tamaño de centos es 209 MB. ¡Esta es una razón importante por la que prefiero usar ubuntu! Usando ubuntu como imagen base, el tamaño después de instalar Python es de 139 MB, y el tamaño después de instalar pip aumenta repentinamente a 407 MB. Si agrega otras decoraciones, fácilmente alcanzará o superará el tamaño de la imagen oficial de Python.
Parece difícil comprimir volúmenes de archivos de imágenes utilizando métodos normales. Afortunadamente, todavía hay una manera de salvar al país, que es el método de construcción en varias etapas.
La idea de la construcción en varias etapas es realmente muy simple. Primero cree una imagen grande y completa y luego saque solo las partes útiles de la imagen y colóquelas en una nueva imagen. En nuestro escenario, pip solo es necesario durante el proceso de creación de la imagen, pero no es útil para ejecutar nuestro programa. Solo necesitamos instalar pip, luego usar pip para instalar la biblioteca de terceros y luego copiar la biblioteca de terceros de esta imagen a una imagen específica de Python sin pip, ahorrando así los 268 MB de espacio ocupado por pip.
1. Instale Python según la imagen de Ubuntu:
Luego ejecute:
Esto generará una imagen de Python:3.8-ubuntu.
2. Instale pip:3.8-Ubuntu basado en Python:
Luego ejecute:
Esto generará una imagen de python:3.8-ubuntu-pip.
3. Imagen de destino de construcción de varias etapas:
Este archivo acoplable necesita explicación porque tiene dos comandos FROM.
La primera es instalar la imagen numpy:3.8-Ubuntu-pip basada en Python. Por supuesto, en aplicaciones reales, todas las bibliotecas de terceros utilizadas están escritas aquí.
La segunda proviene de una imagen basada en python:3.8-ubuntu, que copia todas las bibliotecas de terceros.
–from=0 después del comando COPY significa que la copia comienza desde la etapa 0. En la aplicación real, copie el código del programa del contexto y agregue los puntos de entrada requeridos.
Finalmente, ejecuta de nuevo:
Ahora, la imagen de nuestro proyecto está lista. Es aproximadamente 750 MB más pequeño que la versión creada con la imagen oficial de Python.
En este punto, nuestra imagen ha sido creada, pero ¿dónde está el archivo de imagen y cómo ejecutarlo en un entorno de producción?
Cuando acabas de usar el comando Docker Images, has visto la imagen generada:
Podemos usar el comando Docker Save para guardar la imagen en el archivo especificado y el archivo guardado. es un archivo comprimido. formato tar:
Copie hello.tar a la máquina en el entorno de producción y luego ejecute el comando de importación:
Puede usarlo.