Введение
В этой лабораторной работе вы научитесь использовать команду docker container diff для проверки изменений файловой системы внутри Docker-контейнера. Мы начнём с запуска простого контейнера Nginx, а затем воспользуемся docker container diff, чтобы изучить первоначальные изменения файловой системы, сделанные при создании контейнера.
После первоначальной проверки вы внесёте изменения внутри работающего контейнера. В завершение вы снова воспользуетесь командой docker container diff, чтобы наблюдать и понимать различия в файловой системе, вызванные этими изменениями. Это практическое упражнение даст вам опыт использования этой ценной команды Docker для отладки и понимания поведения контейнеров.
Запуск контейнера 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 отслеживает и отражает эти изменения. Это наглядно продемонстрировало полезность команды для выявления различий между текущим состоянием контейнера и его базовым образом.



