Cuando usamos Docker, comenzamos con una imagen base. Lo arrancamos, creamos cambios y esos cambios se guardan en capas formando otra imagen.
Así que eventualmente tengo una imagen para mi instancia de PostgreSQL y una imagen para mi aplicación web, cambios a los que persisten.
¿Qué es un contenedor?
docker
docker-container
docker-image
bibstha
fuente
fuente
Respuestas:
Una instancia de una imagen se llama contenedor. Tiene una imagen, que es un conjunto de capas como usted describe. Si inicia esta imagen, tiene un contenedor en ejecución de esta imagen. Puede tener muchos contenedores en ejecución de la misma imagen.
Puede ver todas sus imágenes con
docker images
mientras que puede ver sus contenedores en ejecución condocker ps
(y puede ver todos los contenedores condocker ps -a
).Entonces, una instancia en ejecución de una imagen es un contenedor.
fuente
De mi artículo sobre Automatización de implementaciones de Docker :
Imágenes Docker vs. Contenedores
En Dockerland, hay imágenes y hay contenedores . Los dos están estrechamente relacionados, pero son distintos. Para mí, comprender esta dicotomía ha aclarado inmensamente a Docker.
¿Qué es una imagen?
Una imagen es un archivo inerte, inmutable, que es esencialmente una instantánea de un contenedor. Las imágenes se crean con el comando de compilación y producirán un contenedor cuando se inicie con la ejecución . Las imágenes se almacenan en un registro de Docker como el registro.hub.docker.com . Debido a que pueden llegar a ser bastante grandes, las imágenes están diseñadas para estar compuestas de capas de otras imágenes, lo que permite enviar una cantidad mínima de datos al transferir imágenes a través de la red.
Las imágenes locales se pueden enumerar ejecutando
docker images
:Algunas cosas a tener en cuenta:
-t
indicador deldocker build
comando o dedocker tag
una imagen existente. Puede etiquetar imágenes usando una nomenclatura que tenga sentido para usted, pero sepa que Docker usará la etiqueta como ubicación de registro en undocker push
odocker pull
.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Porubuntu
arriba, REGISTRYHOST se infiere que serregistry.hub.docker.com
. Entonces, si planea almacenar su imagen llamadamy-application
en un registro endocker.example.com
, debe etiquetar esa imagendocker.example.com/my-application
.latest
etiqueta no es mágica, es simplemente la etiqueta predeterminada cuando no especifica una etiqueta.<none>
etiqueta y el repositorio. Es fácil olvidarse de ellos.Más información sobre las imágenes está disponible en la documentación y el glosario de Docker .
¿Qué es un contenedor?
Para usar una metáfora de programación, si una imagen es una clase, entonces un contenedor es una instancia de una clase, un objeto de tiempo de ejecución. Con suerte, los contenedores son por qué estás usando Docker; son encapsulaciones ligeras y portátiles de un entorno en el que ejecutar aplicaciones.
Ver contenedores locales en ejecución con
docker ps
:Aquí estoy ejecutando una versión dockerizada del registro de docker, para tener un lugar privado para almacenar mis imágenes. De nuevo, algunas cosas a tener en cuenta:
docker ps
solo salidas que ejecutan contenedores. Puede ver todos los contenedores (en ejecución o detenidos ) condocker ps -a
.--name
bandera.Cómo evitar la acumulación de imágenes y contenedores
Una de mis primeras frustraciones con Docker fue la acumulación aparentemente constante de imágenes sin etiquetar y contenedores detenidos . En un puñado de ocasiones, esta acumulación dio como resultado que los discos duros al máximo desaceleren mi computadora portátil o detengan mi tubería de compilación automatizada. ¡Habla sobre "contenedores en todas partes"!
Podemos eliminar todas las imágenes sin etiquetar combinando
docker rmi
con ladangling=true
consulta reciente :docker images -q --filter "dangling=true" | xargs docker rmi
Docker no podrá eliminar imágenes que están detrás de los contenedores existentes, por lo que es posible que
docker rm
primero deba eliminar los contenedores detenidos con :Estos son puntos débiles conocidos con Docker y pueden abordarse en futuras versiones. Sin embargo, con una comprensión clara de las imágenes y los contenedores, estas situaciones se pueden evitar con un par de prácticas:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.fuente
docker image prune
para limpiar imágenes colgantes. Pode los objetos Docker no utilizadosdocker system prune
para limpiar TODOEn palabras fáciles
Imágenes -
contenedores -
Otros términos importantes a tener en cuenta:
Docker Demonio -
Acoplable cliente -
Tienda Docker -
Una imagen de esta publicación de blog vale más que mil palabras.
(Para una comprensión más profunda, lea esto ).
Resumen:
docker run image_name:tag_name
) => Da una imagen en ejecución, es decir, contenedor (editable)fuente
Si bien es más simple pensar en un contenedor como una imagen en ejecución, esto no es del todo exacto.
Una imagen es realmente una plantilla que se puede convertir en un contenedor. Para convertir una imagen en un contenedor, el motor Docker toma la imagen, agrega un sistema de archivos de lectura y escritura en la parte superior e inicializa varias configuraciones, incluidos los puertos de red, el nombre del contenedor, la ID y los límites de recursos. Un contenedor en ejecución tiene un proceso en ejecución actualmente, pero también se puede detener un contenedor salir en la terminología de Docker). Un contenedor salido no es lo mismo que una imagen, ya que puede reiniciarse y conservará su configuración y cualquier cambio en el sistema de archivos.
fuente
docker create
.Quizás explicar todo el flujo de trabajo puede ayudar.
Todo comienza con el Dockerfile . El Dockerfile es el código fuente de la imagen.
Una vez que se crea el Dockerfile, lo crea para crear la imagen del contenedor. La imagen es solo la "versión compilada" del "código fuente" que es el Dockerfile.
Una vez que tenga la imagen del contenedor, debe redistribuirla utilizando el registro . El registro es como un repositorio Git: puede insertar y extraer imágenes.
A continuación, puede usar la imagen para ejecutar contenedores . Un contenedor en ejecución es muy similar, en muchos aspectos, a una máquina virtual (pero sin el hipervisor ).
fuente
Flujo de trabajo
Aquí está el flujo de trabajo de extremo a extremo que muestra los diversos comandos y sus entradas y salidas asociadas. Eso debería aclarar la relación entre una imagen y un contenedor.
Para enumerar las imágenes que puede ejecutar, ejecute:
Para enumerar los contenedores en los que podría ejecutar comandos:
fuente
No pude entender el concepto de imagen y capa a pesar de leer todas las preguntas aquí y finalmente me topé con esta excelente documentación de Docker (¡duh!).
El ejemplo allí es realmente la clave para entender todo el concepto. Es una publicación larga, así que estoy resumiendo los puntos clave que deben ser realmente comprendidos para obtener claridad.
Imagen : una imagen de Docker se crea a partir de una serie de capas de solo lectura
Capa : cada capa representa una instrucción en el Dockerfile de la imagen.
Example
: El siguiente Dockerfile contiene cuatro comandos, cada uno de los cuales crea una capa.Es importante destacar que cada capa es solo un conjunto de diferencias con respecto a la capa anterior.
Comprensión de imágenes y contenedores desde una perspectiva de tamaño en disco
Para ver el tamaño aproximado de un contenedor en ejecución, puede usar el
docker ps -s
comando. Obtienesize
yvirtual size
como dos de las salidas:Tamaño: la cantidad de datos (en disco) que se usa para la capa de escritura de cada contenedor
Tamaño virtual: la cantidad de datos utilizados para los datos de imagen de solo lectura utilizados por el contenedor. Varios contenedores pueden compartir algunos o todos los datos de imagen de solo lectura. Por lo tanto, estos no son aditivos. Es decir, no puede agregar todos los tamaños virtuales para calcular cuánto tamaño de disco utiliza la imagen.
Otro concepto importante es la estrategia de copiar y escribir
Si existe un archivo o directorio en una capa inferior dentro de la imagen, y otra capa (incluida la capa grabable) necesita acceso de lectura, solo usa el archivo existente. La primera vez que otra capa necesita modificar el archivo (al construir la imagen o ejecutar el contenedor), el archivo se copia en esa capa y se modifica.
Espero que eso ayude a alguien como yo.
fuente
Dockerfile → (Construir) → Imagen → (Ejecutar) → Contenedor .
Dockerfile : contiene un conjunto de instrucciones de Docker que aprovisiona su sistema operativo de la manera que desee e instala / configura todo su software.
Imagen : Dockerfile compilado. Le ahorra tiempo al reconstruir el Dockerfile cada vez que necesita ejecutar un contenedor. Y es una forma de ocultar su código de provisión.
Contenedor : el propio sistema operativo virtual. Puede ingresar y ejecutar cualquier comando que desee, como si fuera un entorno real. Puede ejecutar más de 1000 contenedores desde la misma imagen.
fuente
Simplemente dicho, si una imagen es una clase , entonces un contenedor es una instancia de una clase es un objeto de tiempo de ejecución .
fuente
Un contenedor es solo un binario ejecutable que debe ejecutar el sistema operativo host bajo un conjunto de restricciones que están preestablecidas utilizando una aplicación (por ejemplo, Docker) que sabe cómo indicarle al sistema operativo qué restricciones aplicar.
Las restricciones típicas están relacionadas con el aislamiento del proceso, la seguridad (como usar SELinux protección ) y los recursos del sistema (memoria, disco, CPU y redes).
Hasta hace poco, solo los núcleos en sistemas basados en Unix soportaban la capacidad de ejecutar ejecutables bajo estrictas restricciones. Es por eso que la mayoría de las conversaciones de contenedores de hoy implican principalmente distribuciones Linux u otras distribuciones Unix.
Docker es una de esas aplicaciones que sabe cómo decirle al sistema operativo (Linux en su mayoría) bajo qué restricciones ejecutar un ejecutable. El ejecutable está contenido en la imagen de Docker, que es solo un archivo tar. Ese ejecutable suele ser una versión simplificada de una distribución de Linux (Ubuntu, CentOS, Debian, etc.) preconfigurada para ejecutar una o más aplicaciones dentro.
Aunque la mayoría de las personas usan una base de Linux como ejecutable, puede ser cualquier otra aplicación binaria siempre que el sistema operativo host pueda ejecutarla (vea cómo crear una imagen base simple usando scratch ). Si el binario en la imagen de Docker es un sistema operativo o simplemente una aplicación, para el host del sistema operativo es solo otro proceso, un proceso contenido regido por los límites preestablecidos del sistema operativo.
Otras aplicaciones que, como Docker, pueden indicarle al sistema operativo host qué límites aplicar a un proceso mientras se está ejecutando, incluyen LXC , libvirt y systemd . Docker solía usar estas aplicaciones para interactuar indirectamente con el sistema operativo Linux, pero ahora Docker interactúa directamente con Linux usando su propia biblioteca llamada " libcontainer ".
Entonces, los contenedores son solo procesos que se ejecutan en modo restringido, similar a lo que chroot solía hacer .
En mi opinión, lo que diferencia a Docker de cualquier otra tecnología de contenedores es su repositorio (Docker Hub) y sus herramientas de administración, lo que hace que trabajar con contenedores sea extremadamente fácil.
Ver Docker (software) .
fuente
El concepto central de Docker es facilitar la creación de "máquinas" que en este caso pueden considerarse contenedores. El contenedor ayuda a la reutilización, lo que le permite crear y soltar contenedores con facilidad.
Las imágenes representan el estado de un contenedor en cada momento. Entonces el flujo de trabajo básico es:
fuente
Como muchas respuestas señalaron esto: construye Dockerfile para obtener una imagen y ejecuta la imagen para obtener un contenedor .
Sin embargo, los siguientes pasos me ayudaron a tener una mejor idea de lo que son la imagen y el contenedor de Docker:
1) Construir Dockerfile:
docker build -t my_image dir_with_dockerfile
2) Guarde la imagen en el
.tar
archivodocker save -o my_file.tar my_image_id
my_file.tar
almacenará la imagen. Ábrelo contar -xvf my_file.tar
, y podrás ver todas las capas. Si profundiza en cada capa, puede ver qué cambios se agregaron en cada capa. (Deben estar bastante cerca de los comandos en el Dockerfile).3) Para mirar dentro de un contenedor, puede hacer:
sudo docker run -it my_image bash
y puedes ver que es muy parecido a un sistema operativo.
fuente
La imagen es equivalente a una definición de clase en OOP y las capas son diferentes métodos y propiedades de esa clase.
El contenedor es la instanciación real de la imagen al igual que un objeto es una instanciación o una instancia de una clase.
fuente
Creo que es mejor explicarlo al principio.
Supongamos que ejecuta el comando
docker run hello-world
. ¿Lo que pasa?Llama a Docker CLI, que es responsable de tomar los comandos de Docker y transformarlos para llamar a los comandos del servidor de Docker . Tan pronto como el servidor Docker recibe un comando para ejecutar una imagen , comprueba si el caché de imágenes contiene una imagen con ese nombre.
Supongamos que hello-world no existe. El servidor Docker va a Docker Hub (Docker Hub es solo un repositorio gratuito de imágenes) y pregunta, oye Hub, ¿tienes una imagen llamada
hello-world
? Respuestas del centro: sí, lo hago. Entonces dámelo, por favor. Y comienza el proceso de descarga. Tan pronto como se descarga la imagen de Docker , el servidor de Docker la coloca en el caché de imágenes .Entonces, antes de explicar qué son las imágenes y los contenedores de Docker, comencemos con una introducción sobre el sistema operativo en su computadora y cómo ejecuta el software.
Cuando ejecuta, por ejemplo, Chrome en su computadora, llama al sistema operativo, el sistema operativo en sí llama al núcleo y pregunta, oye, quiero ejecutar este programa. El núcleo logra ejecutar archivos desde su disco duro.
Ahora imagine que tiene dos programas, Chrome y Node.js. Chrome requiere Python versión 2 para ejecutarse y Node.js requiere Python versión 3 para ejecutarse. Si solo instaló Python v2 en su computadora, solo se ejecutará Chrome.
Para que ambos casos funcionen, de alguna manera necesita usar una función del sistema operativo conocida como espacio de nombres. Un espacio de nombres es una característica que le brinda la oportunidad de aislar procesos, discos duros, redes, usuarios, nombres de host, etc.
Entonces, cuando hablamos de una imagen , en realidad hablamos de una instantánea del sistema de archivos. Una imagen es un archivo físico que contiene instrucciones y metadatos para construir un contenedor específico . El contenedor en sí es una instancia de una imagen ; aísla el disco duro utilizando espacios de nombres que solo están disponibles para este contenedor . Por lo tanto, un contenedor es un proceso o conjunto de procesos que agrupa diferentes recursos asignados a él.
fuente
Una imagen de Docker empaqueta la aplicación y el entorno requeridos por la aplicación para ejecutarse, y un contenedor es una instancia en ejecución de la imagen.
Las imágenes son la parte de empaque de Docker, análoga al "código fuente" o un "programa". Los contenedores son la parte de ejecución de Docker, análoga a un "proceso".
En la pregunta, solo se hace referencia a la parte del "programa" y esa es la imagen. La parte "en ejecución" de Docker es el contenedor. Cuando se ejecuta un contenedor y se realizan cambios, es como si el proceso realizara un cambio en su propio código fuente y lo guarda como la nueva imagen.
fuente
Como en el aspecto de programación,
La imagen es el código fuente.
Cuando el código fuente se compila y compila el , se llama una aplicación.
Similar a "cuando se crea una instancia para la imagen", se denomina " contenedor ".
fuente
Una imagen es una "instantánea" de un contenedor . Puede crear imágenes desde un contenedor (nuevas "instantáneas") y también puede iniciar nuevos contenedores desde una imagen (crear una instancia de la "instantánea").
Por ejemplo, puede crear una instancia de un nuevo contenedor a partir de una imagen base, ejecutar algunos comandos en el contenedor y luego tomar una instantánea como una nueva imagen. Luego puede ejecutar 100 contenedores desde esa nueva imagen.
Otras cosas a considerar:
docker images
.fuente
Me gustaría llenar la parte que falta aquí entre
docker images
ycontainers
. Docker utiliza un sistema de archivos de unión ( UFS ) para contenedores, que permite que varios sistemas de archivos se monten en una jerarquía y aparezcan como un solo sistema de archivos. El sistema de archivos de la imagen se ha montado como unaread-only
capa, y cualquier cambio en el contenedor en ejecución se realiza en unaread-write
capa montada encima de esto. Debido a esto, Docker solo tiene que mirar la capa superior de lectura y escritura para encontrar los cambios realizados en el sistema en ejecución.fuente
Para una analogía ficticia de programación, puede pensar que Docker tiene un ImageFactory abstracto que contiene ImageFactories que vienen de la tienda .
Luego, una vez que desee crear una aplicación a partir de esa ImageFactory, tendrá un nuevo contenedor y podrá modificarlo como desee. DotNetImageFactory será inmutable, ya que actúa como una clase abstracta de fábrica, donde solo ofrece las instancias que desee.
fuente
En breve:
El contenedor es una división (virtual) en un núcleo que comparte un sistema operativo común y ejecuta una imagen (imagen Docker).
Un contenedor es una aplicación autosostenible que tendrá paquetes y todas las dependencias necesarias juntas para ejecutar el código.
fuente
Un contenedor Docker está ejecutando una instancia de una imagen. Puede relacionar una imagen con un programa y un contenedor con un proceso :)
fuente
Una imagen es para una clase como un contenedor para un objeto.
Un contenedor es una instancia de una imagen como un objeto es una instancia de una clase.
fuente
Dockerfile es como su script Bash que produce un tarball (imagen Docker).
Los contenedores Docker son como la versión extraída del tarball. Puede tener tantas copias como desee en diferentes carpetas (los contenedores).
fuente