🐳 Отображение различий между двумя образами Docker

Как сравнить два образа Docker

by itisgood

1. Обзор

Поскольку все больше и больше приложений развертывается с помощью Docker, нам важно понимать некоторые основные принципы его экосистемы.
Хотя имеющиеся инструменты позволяют легко упаковывать и развертывать приложения, в какой-то момент нам может понадобиться устранить неполадки в некоторых аспектах нашего развертывания.
Одной из наиболее распространенных задач при отладке развертывания является изучение и сравнение образов. В этом уроке мы рассмотрим структуру образов Docker и то, как увидеть различия между двумя образами.

2. Об образах Docker

Образы Docker – это инструкции по созданию контейнера.
Мы можем рассматривать их как полный набор файлов и каталогов, необходимых для запуска приложения внутри контейнера.
Сюда входит операционная система, библиотеки сторонних разработчиков и код нашего приложения.
Под капотом эти образы, по сути, представляют собой просто tar-файлы.
При сборке образов мы создаем внутри них различные слои.
Каждый слой представляет собой набор файлов и каталогов.
Как правило, мы начинаем с существующего образа и добавляем к нему что-то новое.
Например, чтобы создать образ приложения Spring Boot, мы начнем с существующего образа OpenJDK Docker.
Он содержит операционную систему и файлы JDK, необходимые для запуска любого Java-приложения .
Затем мы добавим наши собственные файлы Java, обычно fat jar приложения, а также все необходимые библиотеки сторонних разработчиков.
В конце сборки у нас есть один образ, содержащий все файлы, необходимые для запуска нашего приложения.
Далее мы рассмотрим, как исследовать один образ.

3. Изучение образа Docker

Существует несколько различных способов изучения образа.
Начнем с поиска всех образов в нашем локальном репозитории:
$ docker image ls
spring-petclinic    2.7.0-SNAPSHOT    0f9d2d05687b   2 months ago    266MB
spring-petclinic    2.6.0-SNAPSHOT    1d79d5bd7779   3 months ago    265MB
Теперь, получив список доступных образов, мы можем посмотреть конкретнее.
Первое, что мы можем сделать, это запустить команду inspect:
$ docker inspect 0f9d2d05687b
[
    {
        "Id": "sha256:0f9d2d05687b8c816cbf54f63cf7e5aa7144d28e1996d468bfaf555a3882610a",
        "RepoTags": [
            "spring-petclinic:2.7.0-SNAPSHOT"
        ],
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 266141567,
        "VirtualSize": 266141567,
        ...
    }
]

Эта команда дает нам множество подробностей об образе, включая время его создания, различные слои внутри него и многое другое.

Однако она не может рассказать нам о содержимом изображения.

Для этого нам нужно сначала сохранить изображение в файловой системе:

$ docker save 0f9d2d05687b > 0f9d2d05687b.tar

Эта команда сохранит изображение в виде tar-файла.

Теперь мы можем использовать привычную команду tar для его изучения:

$ tar tvf 0f9d2d05687b.tar
drwxr-xr-x  0 0      0           0 Dec 31  1979 02805fa4a4f35efdcf3804bc1218af1bc22d28ee521cc944cab5cac5dbe5abfe/
-rw-r--r--  0 0      0           3 Dec 31  1979 02805fa4a4f35efdcf3804bc1218af1bc22d28ee521cc944cab5cac5dbe5abfe/VERSION
-rw-r--r--  0 0      0         477 Dec 31  1979 02805fa4a4f35efdcf3804bc1218af1bc22d28ee521cc944cab5cac5dbe5abfe/json
-rw-r--r--  0 0      0        1024 Dec 31  1979 02805fa4a4f35efdcf3804bc1218af1bc22d28ee521cc944cab5cac5dbe5abfe/layer.tar
drwxr-xr-x  0 0      0           0 Dec 31  1979 0f915e8772f0e40420852f1e2929e4ae9408327cbda6c546c71cca7c3e2f094a/
-rw-r--r--  0 0      0           3 Dec 31  1979 0f915e8772f0e40420852f1e2929e4ae9408327cbda6c546c71cca7c3e2f094a/VERSION
-rw-r--r--  0 0      0         477 Dec 31  1979 0f915e8772f0e40420852f1e2929e4ae9408327cbda6c546c71cca7c3e2f094a/json
-rw-r--r--  0 0      0     3622400 Dec 31  1979 0f915e8772f0e40420852f1e2929e4ae9408327cbda6c546c71cca7c3e2f094a/layer.tar

Команда tar может перечислить и извлечь из образа определенные файлы, в зависимости от того, какую информацию мы ищем.

4. Выявление различий между двумя образами Docker

Итак, мы рассмотрели структуру образа и способы его проверки.

Далее давайте посмотрим, как можно сравнить два образа и найти их различия.

В зависимости от того, какую информацию мы хотим сравнить, существуют различные инструменты, которые могут помочь в этом.

Как мы увидели выше, встроенная команда image может дать нам информацию о размере и дате.

Но если мы хотим сравнить содержимое двух образов, нам придется воспользоваться сторонним инструментом.

Ниже мы рассмотрим несколько из них.

4.1. dff

Один из таких инструментов – container-diff от Google.

Несмотря на свое название, он может сравнивать различные аспекты двух образов и предоставлять отчет в красивом формате.

Например, давайте сравним два образа Spring из предыдущего примера:

$ /usr/local/bin/container-diff diff \
daemon://spring-petclinic:2.6.0-SNAPSHOT \
daemon://spring-petclinic:2.7.0-SNAPSHOT \
--type=file

Система выдает нам различия в файлах каждого  образа.

Вывод обычно разбивается на три части.

Во-первых, он показывает, какие файлы существуют в первом образе, но отсутствуют во втором:

/workspace/BOOT-INF/lib/byte-buddy-1.12.10.jar                                                    3.7M
/workspace/BOOT-INF/lib/classgraph-4.8.139.jar                                                    551.7K
/workspace/BOOT-INF/lib/ehcache-3.10.0.jar                                                        1.7M
/workspace/BOOT-INF/lib/h2-2.1.212.jar                                                            2.4M
/workspace/BOOT-INF/lib/hibernate-core-5.6.9.Final.jar                                            7.1M
/workspace/BOOT-INF/lib/jackson-annotations-2.13.3.jar                                            73.9K

Далее он сообщает нам, какие файлы есть во втором образе, но нет в первом:

These entries have been deleted from spring-petclinic:2.6.0-SNAPSHOT:
FILE                                                                        SIZE
/workspace/BOOT-INF/lib/byte-buddy-1.11.22.jar                              3.5M
/workspace/BOOT-INF/lib/classgraph-4.8.115.jar                              525.4K
/workspace/BOOT-INF/lib/ehcache-3.9.9.jar                                   1.7M
/workspace/BOOT-INF/lib/h2-1.4.200.jar                                      2.2M
/workspace/BOOT-INF/lib/hibernate-core-5.6.7.Final.jar                      7.1M
/workspace/BOOT-INF/lib/jackson-annotations-2.13.2.jar                      73.9K

В этом случае две секции, объединенные вместе, могут очень быстро рассказать нам о том, как изменились зависимости между каждой версией приложения.

И наконец, последняя секция показывает, какие файлы существуют в обеих версиях, но отличаются друг от друга:

These entries have been changed between spring-petclinic:2.6.0-SNAPSHOT and spring-petclinic:2.7.0-SNAPSHOT:
FILE                                                                                                 SIZE1        SIZE2
/layers/config/metadata.toml                                                                         16.6K        1.9K
/workspace/META-INF/maven/org.springframework.samples/spring-petclinic/pom.xml                       13.3K        13.3K
/workspace/BOOT-INF/classes/org/springframework/samples/petclinic/owner/OwnerController.class        7.8K         7.7K
/workspace/org/springframework/boot/loader/ExecutableArchiveLauncher.class                           6.6K         7.5K
/workspace/org/springframework/boot/loader/JarLauncher.class                                         3.9K         2.5K
/workspace/BOOT-INF/classpath.idx                                                                    3.2K         3.2K
/workspace/org/springframework/boot/loader/data/RandomAccessDataFile$FileAccess.class                3.2K         3.2K
/workspace/BOOT-INF/classes/db/h2/data.sql                                                           2.8K         3K
/workspace/org/springframework/boot/loader/data/RandomAccessDataFile$DataInputStream.class           2.6K         2.7K

Этот раздел позволяет легко определить, какие именно классы и файлы свойств изменились в двух версиях.

4.2. Dive

Еще одним отличным инструментом с открытым исходным кодом для проверки образов Docker является dive.

Проверка образов с помощью dive дает нам более традиционный взгляд на их содержимое, поскольку он понимает, как исследовать каждый слой внутри образа.

Это позволяет ему представить каждый образ в виде традиционного дерева файловой системы:

Ранее уже был рассмотрен:

🐳 10 инструментов, дополняющих Docker

С помощью клавиатуры мы можем перемещаться по каждому слою образа и увидеть, какие именно файлы были добавлены, изменены или удалены.

Хотя инструмент погружения не поддерживает сравнение, мы можем сделать это вручную, просто запустив его на двух терминалах рядом друг с другом.

5. Заключение

В этой статье мы рассмотрели структуру образов Docker и различные способы их проверки.

Хотя клиент Docker содержит некоторые инструменты для проверки отдельных образов, сравнение двух образов требует использования сторонних инструментов.

Контейнер-diff от Google – это один из вариантов, созданный специально для сравнения образов.

И хотя утилита diff отлично подходит для проверки слоя одного образа, ее также можно использовать для выявления различий, просто запустив ее на двух образах одновременно.

см. также:

 

You may also like

Leave a Comment