Контейнеры Docker наследуют файловую систему своего образа при первоначальном создании.
Файловая система контейнера может отличаться от содержимого образа после его создания, если были внесены изменения в записываемый слой контейнера.
Возможность проверить изменения в файловой системе может помочь вам отладить проблемы и обнаружить недостающие данные.
Файлы, записанные в файловую систему контейнера, будут потеряны при перезапуске или уничтожении этого контейнера.
В некоторых случаях вы можете непреднамеренно выполнять запись, которая должна быть направлена на постоянный том.
В этой статье мы поделимся некоторыми методами идентификации изменений, внесенных в файловые системы контейнеров.
Вы можете использовать эту информацию для отслеживания активности контейнеров и изучения расхождений между различными средами.
Использование Docker Diff
В Docker CLI есть встроенная команда для этой цели.
Запуск команды docker diff перечислит все изменения, внесенные в файлы и каталоги внутри определенного контейнера.
Команда принимает ID или имя контейнера, который вы хотите проверить.
Запустите простой контейнер для демонстрации:
Это приведет к запуску нового контейнера с образом Alpine.
Ваше окно терминала будет прикреплено к контейнеру.
Держите это окно открытым.
Теперь запустите docker diff во втором сеансе терминала:
Никакого вывода не будет, поскольку свежий контейнер по-прежнему точно соответствует файловой системе образа Alpine.
Переключитесь обратно на первый терминал, который все еще подключен к контейнеру.
Выполните несколько команд, которые добавляют, удаляют или изменяют файлы:
Вернитесь в первое окно оболочки.
Повторите команду docker diff, чтобы увидеть внесенные изменения:
Теперь два новых файла видны на выводе команды.
Выполнение команды touch также добавило записи в историю оболочки контейнера.
Об изменении /root/.ash_history также сообщается, как и о последующем изменении каталога /root.
Интерпретация вывода Docker Diff
Каждая строка вывода docker diff имеет префикс A, C или D в зависимости от типа произошедшего изменения:
- A – Файл или каталог был добавлен в файловую систему контейнера. Он не существовал в исходном образе.
- C – Содержимое файла или каталога отличается от версии в образе.
- D – Путь, присутствующий в образе, был удален из контейнера.
Эта информация позволяет быстро найти несоответствия, которые могут объяснить отсутствующие данные или неожиданное поведение.
Любые изменения файловой системы, которые не отображаются в выводе, затрагивают пути, сопоставленные с томом Docker.
Эти файлы хранятся вне контейнера, независимо от его файловой системы, поэтому они не отображаются docker diff.
Просмотр содержимого исходного образа
Бывает полезно сравнить версию файла, включенного в исходный образ.
Для этого можно создать новый контейнер, а затем скопировать из него файл.
Используйте docker create вместо docker run, чтобы контейнер был создан, но не запущен.
Это гарантирует, что изменения, вызванные скриптом точки входа образа, не повлияют на результат.
Альтернативный способ – запустить контейнер с пользовательской точкой входа, которая выводит содержимое файла в стандартный поток вывода.
Включите флаг –rm, чтобы контейнер автоматически удалялся после завершения команды:
Сравнение различий между двумя контейнерами
Иногда вам может понадобиться сравнить различия между двумя разными контейнерами с одного образа.
Сначала используйте docker diff для получения индивидуальных списков изменений:
Теперь вы можете использовать стандартные инструменты Unix, такие как команда diff, чтобы найти различия в двух списках изменений:
Разница показывает, что /a-new-file был удален во втором контейнере, а /demo был добавлен.
Другой способ сравнить контейнеры – использовать docker export и команду tar для получения доступа к полному списку файлов:
Повторите эту команду для обоих контейнеров.
Заключение
Файловые системы контейнеров Docker должны быть очень похожи на образ, на основе которого они были созданы.
Расхождения могут возникать в тех случаях, когда программное обеспечение внутри контейнера записывает содержимое непосредственно в файловую систему.
Пользователи могут быть еще одним источником расхождений, когда такие механизмы, как docker exec, используются для выполнения команд внутри запущенного контейнера.
- 🐳 Как подключиться к контейнеру Docker по ssh
- 🐳 Как определить DNS в контейнерах Docker
- 🐳 Где хранятся образы, контейнеры и тома Docker в хост-системе Linux?
- 🔐 Как установить сервер OpenSSH на Alpine Linux (включая Docker)
- 🐳 Как защитить TCP-сокет Docker с помощью TLS
- 🐳 Как создать и использовать сеть MacVLAN в Docker
- 🐳 Как просмотреть историю событий Docker
- 🐳 Как узнать IP-адрес Docker контейнера
- 🐳 Как проверить установленные сетевые подключения внутри Docker?
- 🐳 Сканирование образов Docker на наличие уязвимостей с помощью Trivy
- 🐳 Как исправить ошибку, когда контейнер Docker не запускается
- 🐳 Как запустить Docker / Podman контейнеры в качестве службы Systemd