{"id":88331,"date":"2022-08-11T16:13:55","date_gmt":"2022-08-11T16:13:55","guid":{"rendered":"https:\/\/magazineoffice.com\/como-inspeccionar-los-cambios-en-el-sistema-de-archivos-de-un-contenedor-docker\/"},"modified":"2022-08-11T16:13:56","modified_gmt":"2022-08-11T16:13:56","slug":"como-inspeccionar-los-cambios-en-el-sistema-de-archivos-de-un-contenedor-docker","status":"publish","type":"post","link":"https:\/\/magazineoffice.com\/como-inspeccionar-los-cambios-en-el-sistema-de-archivos-de-un-contenedor-docker\/","title":{"rendered":"C\u00f3mo inspeccionar los cambios en el sistema de archivos de un contenedor Docker"},"content":{"rendered":"


\n<\/p>\n

\n

Los contenedores Docker heredan el sistema de archivos de su imagen en la creaci\u00f3n inicial. El sistema de archivos del contenedor puede diferir del contenido de la imagen despu\u00e9s de la creaci\u00f3n si se realizan cambios en la capa de escritura del contenedor.<\/p>\n

La capacidad de inspeccionar los cambios en el sistema de archivos puede ayudarlo a depurar problemas e investigar los datos faltantes. Los archivos escritos en el sistema de archivos del contenedor se perder\u00e1n cuando ese contenedor se reinicie o se destruya. En algunos casos, es posible que est\u00e9 realizando escrituras sin querer que deber\u00edan dirigirse a un volumen persistente.<\/p>\n

En este art\u00edculo, compartiremos algunas t\u00e9cnicas para identificar las modificaciones realizadas en los sistemas de archivos del contenedor. Puede utilizar esta informaci\u00f3n para realizar un seguimiento de la actividad del contenedor e investigar discrepancias entre diferentes entornos.<\/p>\n

Uso de diferencias de Docker<\/h2>\n

La CLI de Docker tiene un comando incorporado para este prop\u00f3sito. Correr docker diff<\/code> enumerar\u00e1 todos los cambios realizados en archivos y directorios dentro de un contenedor en particular. Acepta el ID o nombre del contenedor que desea inspeccionar.<\/p>\n

Inicie un contenedor simple para fines de demostraci\u00f3n:<\/p>\n

$ docker run -it --name alpine alpine:latest sh<\/pre>\n

Esto iniciar\u00e1 un nuevo contenedor que ejecuta la imagen de Alpine. Su ventana de terminal se adjuntar\u00e1 al contenedor. Mantenga esta ventana abierta.<\/p>\n

ahora corre docker diff<\/code> en una segunda sesi\u00f3n de terminal:<\/p>\n

$ docker diff alpine<\/pre>\n

No se produce ning\u00fan resultado ya que el contenedor nuevo a\u00fan coincide exactamente con el sistema de archivos de la imagen de Alpine.<\/p>\n

Vuelva a su primera terminal que todav\u00eda est\u00e1 conectada al contenedor. Ejecute algunos comandos que agregan, eliminan o cambian archivos:<\/p>\n

\/ # touch demo
\n\/ # touch example<\/pre>\n

Regrese a su primera ventana de shell. Repite el docker diff<\/code> comando para ver los cambios que se han hecho:<\/p>\n

$ docker diff alpine
\nA \/example
\nC \/root
\nC \/root\/.ash_history
\nA \/demo<\/pre>\n

Ahora los dos archivos nuevos son visibles en la salida del comando. Correr touch<\/code> tambi\u00e9n agreg\u00f3 entradas al historial de shell del contenedor. la modificaci\u00f3n a \/root\/.ash_history<\/code> tambi\u00e9n se informa, as\u00ed como el consiguiente cambio en la \/root<\/code> directorio.<\/p>\n

Interpretaci\u00f3n de la salida de Docker Diff<\/h2>\n

Cada l\u00ednea de salida producida por docker diff<\/code> est\u00e1 precedido por cualquiera A<\/code>, C<\/code> o D<\/code> dependiendo del tipo de cambio que ocurri\u00f3:<\/p>\n

    \n
  • A<\/code> \u2013 El archivo o directorio se ha agregado al sistema de archivos del contenedor. No existe en la imagen original.<\/li>\n
  • C<\/code> \u2013 El contenido del archivo o directorio es diferente a la versi\u00f3n de la imagen.<\/li>\n
  • D<\/code> \u2013 Una ruta que est\u00e1 presente en la imagen se elimin\u00f3 del contenedor.<\/li>\n<\/ul>\n

    Esta informaci\u00f3n le permite buscar r\u00e1pidamente discrepancias que podr\u00edan explicar la falta de datos o un comportamiento inesperado.<\/p>\n

    Cualquier cambio en el sistema de archivos que no se muestre en la salida tendr\u00e1 rutas afectadas que se asignan a un volumen de Docker. Estos archivos se almacenan fuera del contenedor, independientemente de su sistema de archivos, por lo que no aparecen por docker diff<\/code> .<\/p>\n

    Ver contenido en la imagen original<\/h2>\n

    Puede ser \u00fatil comparar la versi\u00f3n del archivo que se incluye en la imagen original. Puede hacer esto creando un nuevo contenedor y luego copiando el archivo. Usar docker create<\/code> en vez de docker run<\/code> por lo que el contenedor se crea pero no se inicia. Esto asegurar\u00e1 que las modificaciones causadas por el script del punto de entrada de la imagen no afecten el resultado.<\/p>\n

    $ docker create --name temp-container my-image:latest
\n$ docker cp temp-container:\/path\/to\/file copied-file
\n$ docker rm temp-container<\/pre>\n

    Una forma alternativa es ejecutar el contenedor con un punto de entrada personalizado que emite el contenido del archivo al flujo de salida est\u00e1ndar. Incluir la --rm<\/code> marca para que el contenedor se elimine autom\u00e1ticamente despu\u00e9s de que se complete el comando:<\/p>\n

    $ docker run --rm --entrypoint cat alpine:latest \/path\/to\/file > copied-file<\/pre>\n

    Comparando las diferencias entre dos contenedores<\/h2>\n

    A veces, es posible que deba comparar las diferencias entre dos contenedores diferentes que ejecutan la misma imagen. Primer uso docker diff<\/code> para obtener las listas de cambios individuales:<\/p>\n

    $ docker diff first-container > first
\n$ docker diff second-container > second<\/pre>\n

    Ahora puede utilizar las herramientas est\u00e1ndar de Unix, como el diff<\/code> Comando para encontrar las diferencias en las dos listas de cambios:<\/p>\n

    diff first second
\n3c3
\n< A \/a-new-file
\n---
\n> A \/demo<\/pre>\n

    La diferencia muestra que \/a-new-file<\/code> ha sido removido en el segundo contenedor mientras \/demo<\/code> ha sido a\u00f1adido.<\/p>\n

    Otra forma de comparar contenedores es usar docker export<\/code> y el comando tar para acceder a una lista completa de archivos:<\/p>\n

    $ docker export demo-container | tar tv
\n-rwxr-xr-x 0\/0               0 2022-06-21 14:21 .dockerenv
\ndrwxr-xr-x 0\/0               0 2022-05-23 17:51 bin\/
\nlrwxrwxrwx 0\/0               0 2022-05-23 17:51 bin\/arch -> \/bin\/busybox
\nlrwxrwxrwx 0\/0               0 2022-05-23 17:51 bin\/ash -> \/bin\/busybox
\nlrwxrwxrwx 0\/0               0 2022-05-23 17:51 bin\/base64 -> \/bin\/busybox
\nlrwxrwxrwx 0\/0               0 2022-05-23 17:51 bin\/bbconfig -> \/bin\/busybox
\n...<\/pre>\n

    Repita este comando para ambos contenedores. A continuaci\u00f3n, puede utilizar diff<\/code> para comparar las dos listas. La salida mejorada de tar puede ayudarlo a rastrear cu\u00e1ndo cambiaron los archivos a medida que se muestran los tiempos de modificaci\u00f3n y los permisos.<\/p>\n

    Resumen<\/h2>\n

    Los sistemas de archivos de los contenedores Docker deben parecerse mucho a la imagen a partir de la cual se crearon. Pueden ocurrir discrepancias cuando el software dentro del contenedor escribe contenido directamente en el sistema de archivos. Los usuarios pueden ser otra fuente de diferencias, cuando mecanismos como docker exec<\/code> se utilizan para ejecutar comandos dentro de un contenedor en ejecuci\u00f3n.<\/p>\n

    los docker diff<\/code> La utilidad proporciona una manera conveniente de ver estos cambios. Aunque no puede ver por qu\u00e9 se agreg\u00f3 o elimin\u00f3 un archivo, la capacidad de recuperar una lista de modificaciones puede ser invaluable para comprender por qu\u00e9 se observa un comportamiento particular.<\/p>\n

    En este art\u00edculo nos hemos centrado en examinar los cambios realizados en los contenedores en ejecuci\u00f3n. Puedes usar diferentes herramientas como docker history<\/code> y Dive para inspeccionar los cambios realizados en las capas dentro de una imagen de Docker. Los dos enfoques se pueden usar en conjunto, lo que le permite determinar el punto exacto en que se agreg\u00f3 o modific\u00f3 un archivo dentro de la pila de capas de un contenedor.<\/p>\n<\/div>\n