Как использовать команду docker container diff для проверки изменений файловой системы контейнера

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь использовать команду docker container diff для проверки изменений файловой системы внутри Docker-контейнера. Мы начнём с запуска простого контейнера Nginx, а затем воспользуемся docker container diff, чтобы изучить первоначальные изменения файловой системы, сделанные при создании контейнера.

После первоначальной проверки вы внесёте изменения внутри работающего контейнера. В завершение вы снова воспользуетесь командой docker container diff, чтобы наблюдать и понимать различия в файловой системе, вызванные этими изменениями. Это практическое упражнение даст вам опыт использования этой ценной команды Docker для отладки и понимания поведения контейнеров.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555107{{"Как использовать команду docker container diff для проверки изменений файловой системы контейнера"}} docker/ps -.-> lab-555107{{"Как использовать команду docker container diff для проверки изменений файловой системы контейнера"}} docker/rm -.-> lab-555107{{"Как использовать команду docker container diff для проверки изменений файловой системы контейнера"}} docker/exec -.-> lab-555107{{"Как использовать команду docker container diff для проверки изменений файловой системы контейнера"}} docker/inspect -.-> lab-555107{{"Как использовать команду docker container diff для проверки изменений файловой системы контейнера"}} docker/pull -.-> lab-555107{{"Как использовать команду docker container diff для проверки изменений файловой системы контейнера"}} docker/images -.-> lab-555107{{"Как использовать команду docker container diff для проверки изменений файловой системы контейнера"}} end

Запуск контейнера Nginx

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

Сначала убедимся, что образ Nginx доступен в нашей системе. Мы можем загрузить официальный образ Nginx из Docker Hub с помощью команды docker pull. Эта команда скачивает образ на ваш локальный компьютер.

docker pull nginx:latest

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

docker images

В выводе должен отображаться nginx.

Теперь запустим контейнер Nginx. Используем команду docker run. Флаг -d запускает контейнер в detached mode (в фоновом режиме), а флаг -p 80:80 сопоставляет порт 80 на хосте с портом 80 внутри контейнера. Это позволяет получить доступ к веб-серверу Nginx из браузера хоста. Также мы задаём контейнеру имя с помощью --name my-nginx-container для удобства идентификации.

docker run -d -p 80:80 --name my-nginx-container nginx

После выполнения команды Docker выведет длинную строку — идентификатор контейнера. Это означает, что контейнер успешно запущен в фоновом режиме.

Чтобы убедиться, что контейнер работает, можно использовать команду docker ps, которая выводит список всех запущенных контейнеров:

docker ps

В списке должен отображаться my-nginx-container со статусом Up.

Наконец, проверим доступность веб-сервера Nginx с хоста. Поскольку мы сопоставили порт 80, можно использовать curl для отправки HTTP-запроса на localhost порта 80.

curl localhost

В выводе вы увидите HTML-код стандартной приветственной страницы Nginx. Это подтверждает, что контейнер Nginx работает и доступен.

Проверка начальных изменений файловой системы с помощью docker container diff

На этом шаге мы рассмотрим, как проверить изменения файловой системы, происходящие при запуске Docker-контейнера. Docker использует многослойную файловую систему, и при запуске контейнера поверх слоёв образа добавляется новый записываемый слой. Команда docker container diff позволяет увидеть различия, внесённые в этот записываемый слой с момента создания контейнера.

Команда docker container diff принимает в качестве аргумента имя или идентификатор контейнера. Мы будем использовать имя контейнера Nginx, запущенного на предыдущем шаге — my-nginx-container.

docker container diff my-nginx-container

При запуске этой команды сразу после старта контейнера вы, скорее всего, увидите список файлов и каталогов. Вывод показывает изменения в файловой системе контейнера относительно базового образа. Формат вывода обычно следующий:

  • A означает, что файл или каталог был добавлен.
  • C означает, что файл или каталог был изменён.
  • D означает, что файл или каталог был удалён.

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

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

Внесение изменений внутри контейнера

На этом шаге мы внесём изменения в файловую систему работающего контейнера Nginx. Это продемонстрирует, как изменения внутри контейнера записываются в его записываемый слой.

Мы будем использовать команду docker exec для выполнения команд внутри контейнера. Эта команда позволяет запускать команды в работающем контейнере. Нам нужно указать имя контейнера (my-nginx-container) и команду, которую мы хотим выполнить.

Сначала создадим новый файл в каталоге /tmp контейнера с помощью команды touch:

docker exec my-nginx-container touch /tmp/my_new_file.txt

Эта команда выполняет touch /tmp/my_new_file.txt внутри контейнера my-nginx-container. При успешном выполнении команды вывода не будет.

Затем изменим стандартный индексный файл Nginx. Стандартная приветственная страница Nginx обычно находится по пути /usr/share/nginx/html/index.html внутри контейнера. Используем команду echo для добавления текста в этот файл:

docker exec my-nginx-container echo "<h1>Hello from LabEx!</h1>" >> /usr/share/nginx/html/index.html

Эта команда добавляет HTML-строку "

Hello from LabEx!

" в файл index.html внутри контейнера.

Чтобы проверить изменения, снова воспользуемся curl с хоста для доступа к серверу Nginx:

curl localhost

Теперь вы должны увидеть оригинальное содержимое приветственной страницы Nginx с добавленной строкой "

Hello from LabEx!

". Это подтверждает, что файл index.html внутри контейнера был изменён.

Все внесённые изменения (создание нового файла и модификация существующего) записываются в записываемый слой контейнера my-nginx-container. На следующем шаге мы снова используем docker container diff, чтобы увидеть эти конкретные изменения.

Проверка обновлённых изменений файловой системы с помощью docker container diff

В этом завершающем шаге мы снова воспользуемся командой docker container diff, чтобы наблюдать изменения файловой системы, внесённые на предыдущем шаге. Это наглядно покажет, как наши действия внутри контейнера отражаются в его записываемом слое.

Напомним, что на предыдущем шаге мы создали новый файл /tmp/my_new_file.txt и изменили файл /usr/share/nginx/html/index.html внутри контейнера my-nginx-container. Теперь снова выполним docker container diff для этого контейнера.

docker container diff my-nginx-container

В этот раз вывод должен содержать внесённые нами изменения. Вы увидите строки, похожие на эти:

A /tmp/my_new_file.txt
C /usr/share/nginx/html/index.html

Строка A /tmp/my_new_file.txt указывает, что новый файл my_new_file.txt был добавлен (Added) в каталог /tmp.
Строка C /usr/share/nginx/html/index.html показывает, что файл index.html в каталоге /usr/share/nginx/html/ был изменён (Changed).

Этот вывод подтверждает, что docker container diff эффективно отображает модификации файловой системы контейнера с момента его запуска. Эти изменения хранятся в записываемом слое контейнера, который отделён от слоёв базового образа. Это фундаментальная концепция многослойной файловой системы Docker и способа, которым контейнеры сохраняют своё состояние.

При удалении контейнера этот записываемый слой также удаляется, и все внесённые изменения теряются, если они не были сохранены с использованием томов или bind-монтирований (это темы для других лабораторных работ).

Для очистки можно остановить и удалить контейнер:

docker stop my-nginx-container
docker rm my-nginx-container

На этом наше знакомство с docker container diff завершено. Вы узнали, как проверять начальные изменения файловой системы при запуске контейнера и как отслеживать изменения, вносимые в работающий контейнер.

Итоги

В этой лабораторной работе мы научились запускать простой контейнер Nginx с помощью команды docker run, обеспечивая его доступность через проброс портов и проверяя статус с помощью docker ps. Затем мы изучили команду docker container diff для проверки начальных изменений файловой системы, внесённых слоями образа контейнера при его создании.

Далее мы попрактиковались во внесении изменений в файловую систему работающего контейнера и снова использовали docker container diff, чтобы наблюдать и понимать, как Docker отслеживает и отражает эти изменения. Это наглядно продемонстрировало полезность команды для выявления различий между текущим состоянием контейнера и его базовым образом.