¿Cuál es la diferencia entre un contenedor de Linux y una imagen?

Uno de los problemas con la programación de ordenadores es que los mismos nombres se usan una y otra vez para diferentes propósitos. Por ejemplo, el término se usa de diferentes maneras. A menudo me confunde cuando la gente habla de espacios de nombres en Kubernetes. Por ejemplo, algunas personas escuchan el término y piensan en clústeres virtuales, pero cuando lo escucho, pienso en los espacios de nombres de Linux que se usan con pods y contenedores. Del mismo modo, puede hacer referencia a una imagen de máquina virtual, una imagen de contenedor o una imagen OCI almacenada en un registro de contenedor.

Pero en el mundo de los contenedores, no hay término más abusado que.

Recientemente, un usuario creó un Podman publicar, expresar su frustración en esta terminología:

Estoy pensando en ejecutar procesos en un entorno o algo que esté listo para ejecutarse. Por el contrario, los contenedores validados están listos para compartirse con otros para crear nuevos contenedores.

Los motores de contenedores con los que trabajamos: Podman, Construido, CRI-O, y Skopeo- todos comparten el mismo concepto de imágenes.

Las imágenes se definen en contenedores / imagen y almacenados en diferentes repositorios o transportes, como registros de contenedores, archivos Docker, archivos OCI, daemon docker y contenedores/almacenamiento. Hablé de este tipo de almacenamiento o transporte en un artículo anterior.

La mayoría de la gente piensa que las imágenes se colocan en contenedores/almacenamiento o registros de contenedores. Para el resto de esta descripción, nos centraremos en contenedores/almacenamiento.

Además, Skopeo no es realmente un motor de contenedores ya que no tiene un concepto de contenedor. En cambio, Skopeo solo procesa imágenes de contenedores y las mueve entre diferentes tipos de almacenamiento de contenedores.

Índice

    Contenedor / contenedores de almacenamiento

    El contenedor de almacenamiento/biblioteca también ofrece su propio concepto de contenedor de almacenamiento. Básicamente, los contenedores de almacenamiento están organizando contenido que aún no ha sido validado. Piense en ello como archivos en disco y JSON que describen el contenido.

    Podman, Buildah y CRI-O se usan todos. Los tres motores de contenedores también tienen datos adicionales específicos para ellos.

    Contenedores Buildah

    Los contenedores de Buildah incluyen contenido adicional que hace referencia a los diversos comandos que componen el Containerfile o el Dockerfile.

    Por ejemplo, Workingdir, Env variables y otros datos se utilizan para crear una imagen de contenedor.

    Contenedores Podman

    Podman tiene su propio almacén de datos vinculado a un contenedor de Podman. Hay muchos más datos almacenados en la base de datos de Podman que en la base de datos de Buildah. Puede pensar en la base de datos Buildah como un subconjunto de la base de datos Podman.

    Contenedores CRI-O

    CRI-O también tiene su propio almacén de datos para describir sus contenedores.

    Las tres herramientas han evolucionado de manera diferente y tienen diferentes ideas y requisitos para sus propios contenedores.

    Por ejemplo, los contenedores CRI-O han evolucionado basándose en un solo demonio que los controla. La atención se centra en el rendimiento y la necesidad de compartir cientos o miles de respuestas IRC de Kubernetes por segundo. Dado que CRI-O sabe que es el único que se ocupa del almacenamiento de datos, puede beneficiarse del almacenamiento de información en la memoria. CRI-O no necesita preocuparse de que otros procesos ingresen y modifiquen contenedores sin su conocimiento.

    Podman, por otro lado, tiene que lidiar con múltiples usuarios de sus contenedores al mismo tiempo. Necesita confiar más en bloquear el sistema de archivos y garantizar que cientos de ejecutables de Podman puedan compartir de manera confiable el mismo almacén de datos. Hemos hablado sobre la posibilidad de fusionar el banco de datos de Podman con CRI-O para que CRI-O y Podman puedan trabajar mejor juntos, pero con el tiempo creemos que el riesgo/beneficio es difícil de justificar la fusión.

    Buildah también se desarrolló como una herramienta independiente. Los mantenedores se han negado a asumir el peso y la complejidad innecesarios del almacén de datos de Podman por poco o ningún beneficio adicional. Los contenedores Buildah tienen un objetivo: crear una imagen de contenedor, mientras que la mayoría de los contenedores Podman tienen más que ver con la ejecución de aplicaciones y servicios. Los contenedores Buildah no contienen toda la información que Podman necesitaría.

    ¿Cómo manejaría Podman un contenedor creado con el buildah from scratch ¿pedido?

    Todavía necesitaríamos tratar estos contenedores parcialmente creados de manera diferente. Por lo tanto, haga que Podman los vea como equivalentes o incluso enumerados por defecto en podman ps comando confundiría a los usuarios.

    Compatibilidad

    Podman realmente puede trabajar con estos contenedores.

    Las últimas versiones de Podman ahora pueden enumerar los contenedores de almacenamiento disponibles en el sistema:

    $ podman ps -a --external | grep buildah
    
    578edf9430ee scratch buildah 13 days ago Almacenamiento working-container

    Puedes montar y desmontar estos contenedores:

    # podman mount working-container
    
    /home/dwalsh/.local/share/Contenedores/Almacenamiento/overlay/a4f596beaabdc78efc7694a67d690097e327aa12bbc59165d011e62b646e93c0/merged
    
    # podman unmount working-container
    
    working-container

    También puede eliminar estos contenedores:

    $ podman rm working-container
    
    working-container

    También puede crear estos contenedores usando podman build. Por supuesto, estos contenedores solo se crean temporalmente durante la construcción. Dado que estos contenedores Buildah no tienen los mismos datos que un contenedor Podman, Podman no puede iniciarlos ni detenerlos, y podman ps no los muestra cuando se están ejecutando.

    Podman también tiene una capacidad similar para trabajar con contenedores CRI-O.

    Conclusión

    Cuando se trata del término, el contexto suele ser crítico. Comprender la diferencia entre los usos es esencial. Cuando se trata de nuestras herramientas de contenedores, compartimos la mayor parte del contenido, el almacenamiento y las bibliotecas subyacentes. Pero hay razones legítimas por las que cada herramienta tiene conceptos o definiciones ligeramente diferentes o sus contenedores.

    Artículos de interés

    Subir