Введение
В этой лабораторной работе вы научитесь использовать команду docker compose rm для удаления остановленных контейнеров. Мы начнём с подготовки простого проекта Docker Compose, который включает установку Docker Compose и создание файла docker-compose.yml для определения базового веб-сервиса.
После настройки проекта вы попрактикуетесь в остановке сервисных контейнеров. Основная часть лабораторной работы посвящена использованию docker compose rm для удаления этих остановленных контейнеров, рассматривая сценарии без томов (volumes), с анонимными томами (anonymous volumes) и, наконец, демонстрации принудительного удаления контейнеров.
Подготовка простого проекта Docker Compose
На этом шаге мы подготовим простой проект Docker Compose. Поскольку Docker Compose не предустановлен в среде LabEx, сначала мы его установим. Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. С помощью Compose вы используете YAML-файл для настройки сервисов вашего приложения. Затем одной командой создаёте и запускаете все сервисы из конфигурации.
Сначала установим Docker Compose. Загрузим последнюю стабильную версию и сделаем её исполняемой.
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
После установки проверим её, запросив версию.
docker-compose --version
В выводе должен отобразиться номер версии, подтверждающий корректную установку Docker Compose.
Теперь создадим простой проект Docker Compose. Создадим директорию для проекта и файл docker-compose.yml внутри неё. Этот файл определит простой веб-сервис с использованием образа nginx.
Перейдём в директорию проекта.
cd ~/project
Создадим новую директорию для проекта, например, my-web-app.
mkdir my-web-app
cd my-web-app
Теперь создадим файл docker-compose.yml в редакторе nano.
nano docker-compose.yml
Добавим следующее содержимое в файл docker-compose.yml:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
Этот файл docker-compose.yml определяет один сервис с именем web. Он использует Docker-образ nginx:latest и пробрасывает 80-й порт хоста на 80-й порт контейнера.
Сохраним файл, нажав Ctrl + X, затем Y и Enter.
Теперь можно запустить сервисы, определённые в файле docker-compose.yml, командой docker-compose up. Флаг -d запускает контейнеры в detached mode (фоновом режиме).
docker-compose up -d
Эта команда загрузит образ nginx:latest (если он ещё не загружен) и запустит контейнер для сервиса web.
Статус запущенных контейнеров можно проверить командой docker ps.
docker ps
Должен отобразиться контейнер с именем my-web-app_web_1 (или аналогичным, в зависимости от имени директории), работающий и пробрасывающий 80-й порт.
Чтобы убедиться, что веб-сервер работает, можно использовать curl для обращения к нему.
curl http://localhost
В выводе должна отобразиться HTML-страница приветствия Nginx. Это подтверждает, что наш простой проект Docker Compose настроен и работает корректно.
Остановка сервисных контейнеров
На предыдущем шаге мы запустили наш простой веб-сервис с помощью команды docker-compose up -d. Контейнер сейчас работает в фоновом режиме. В этом шаге мы научимся останавливать работающие сервисные контейнеры с помощью Docker Compose.
Для остановки работающих контейнеров, определённых в файле docker-compose.yml, используется команда docker-compose stop. Эта команда отправляет контейнерам сигнал SIGTERM, позволяя им корректно завершить работу.
Убедитесь, что находитесь в директории ~/project/my-web-app, где расположен ваш файл docker-compose.yml.
cd ~/project/my-web-app
Теперь выполните команду docker-compose stop.
docker-compose stop
Вы увидите вывод, указывающий на остановку контейнера.
После выполнения команды stop контейнеры будут остановлены, но не удалены. Это можно проверить, выведя список всех контейнеров, включая остановленные, с помощью команды docker ps -a.
docker ps -a
Вы должны увидеть контейнер my-web-app_web_1 со статусом Exited. Это подтверждает успешную остановку контейнера.
Если вы попробуете снова обратиться к веб-серверу через curl, запрос завершится ошибкой, так как контейнер остановлен.
curl http://localhost
Должна появиться ошибка соединения, указывающая, что веб-сервис больше не работает.
Остановка контейнеров полезна, когда вам нужно временно приостановить работу сервисов без удаления их конфигурации или данных. В следующих шагах мы рассмотрим, как удалить эти остановленные контейнеры.
Удаление остановленных сервисных контейнеров без томов
На предыдущем шаге мы остановили работающий контейнер с помощью команды docker-compose stop. Теперь контейнер находится в состоянии Exited. В этом шаге мы научимся удалять такие остановленные контейнеры с помощью Docker Compose.
Для удаления остановленных контейнеров, определённых в файле docker-compose.yml, используется команда docker-compose rm. По умолчанию эта команда удаляет только остановленные сервисные контейнеры, не затрагивая тома (volumes) и сети.
Убедитесь, что находитесь в директории ~/project/my-web-app, где расположен ваш файл docker-compose.yml.
cd ~/project/my-web-app
Теперь выполните команду docker-compose rm. Вам будет предложено подтвердить удаление. Введите y и нажмите Enter.
docker-compose rm
Вы увидите вывод, указывающий на удаление контейнера.
После выполнения команды rm контейнер должен быть удалён. Это можно проверить, выведя список всех контейнеров, включая остановленные, с помощью команды docker ps -a.
docker ps -a
Контейнер my-web-app_web_1 больше не должен отображаться в списке. Это подтверждает успешное удаление контейнера.
Удаление остановленных контейнеров помогает очистить систему и освободить ресурсы. В следующих шагах мы рассмотрим, как работать с томами при удалении контейнеров.
Удаление остановленных сервисных контейнеров с анонимными томами
На предыдущем шаге мы удалили остановленный контейнер. Теперь рассмотрим, как удалять контейнеры вместе с связанными анонимными томами. Анонимные тома — это тома, которые не имеют явного имени в файле docker-compose.yml. Docker автоматически присваивает им случайное имя.
Сначала изменим наш файл docker-compose.yml, добавив анонимный том. Мы подключим том к сервису web.
Убедитесь, что находитесь в директории ~/project/my-web-app.
cd ~/project/my-web-app
Отредактируйте файл docker-compose.yml.
nano docker-compose.yml
Добавьте секцию volumes в определение сервиса web. Мы подключим анонимный том к /usr/share/nginx/html внутри контейнера — это место, где Nginx хранит контент по умолчанию.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- /usr/share/nginx/html
Сохраните файл, нажав Ctrl + X, затем Y и Enter.
Теперь снова запустим сервис. Это создаст новый контейнер и анонимный том.
docker-compose up -d
Список томов Docker можно просмотреть командой docker volume ls. Вы увидите том с длинным случайно сгенерированным именем, связанный с вашим проектом.
docker volume ls
Теперь снова остановите сервисные контейнеры.
docker-compose stop
Проверьте, что контейнер остановлен, используя docker ps -a.
docker ps -a
Вы должны увидеть контейнер my-web-app_web_1 в состоянии Exited.
Для удаления остановленных контейнеров вместе с их анонимными томами используйте команду docker-compose rm с флагом -v.
docker-compose rm -v
Вам будет предложено подтвердить удаление. Введите y и нажмите Enter.
После выполнения команды проверьте удаление контейнера с помощью docker ps -a.
docker ps -a
Контейнер my-web-app_web_1 больше не должен отображаться в списке.
Теперь снова проверьте тома командой docker volume ls.
docker volume ls
Анонимный том, созданный для сервиса web, также должен быть удалён. Это демонстрирует, как флаг -v удаляет анонимные тома вместе с контейнерами.
Принудительное удаление остановленных сервисных контейнеров
На предыдущих шагах мы останавливали и удаляли контейнеры. Иногда может потребоваться удалить контейнеры, даже если они всё ещё работают. В этом случае полезной будет опция принудительного удаления.
Сначала снова запустим наш сервис.
Убедитесь, что находитесь в директории ~/project/my-web-app.
cd ~/project/my-web-app
Запустите сервис в фоновом режиме.
docker-compose up -d
Проверьте, что контейнер работает, используя docker ps.
docker ps
Вы должны увидеть контейнер my-web-app_web_1 со статусом Up.
Теперь попробуем удалить работающий контейнер без предварительной остановки. Если попытаться использовать docker-compose rm на работающем контейнере, команда завершится ошибкой.
docker-compose rm
Вы увидите сообщение об ошибке, указывающее, что контейнер работает и не может быть удалён.
Для принудительного удаления работающих контейнеров используем команду docker-compose rm с флагом -f. Этот флаг принудительно удаляет контейнеры без запроса подтверждения и без корректной остановки.
docker-compose rm -f
Вы увидите вывод, указывающий на удаление контейнера. Обратите внимание, что на этот раз подтверждение не запрашивалось.
После выполнения команды проверьте удаление контейнера с помощью docker ps -a.
docker ps -a
Контейнер my-web-app_web_1 больше не должен отображаться в списке. Это подтверждает, что контейнер был принудительно удалён, несмотря на то что он работал.
Использовать опцию принудительного удаления следует с осторожностью, так как это может привести к потере данных, если контейнер записывал данные в том, который не управляется явно.
На этом завершается наше знакомство с удалением сервисных контейнеров Docker Compose. Вы научились останавливать контейнеры, удалять остановленные контейнеры без томов, удалять остановленные контейнеры с анонимными томами и принудительно удалять работающие контейнеры.
Резюме
В этой лабораторной работе мы изучили, как использовать команду docker compose rm для удаления остановленных контейнеров. Мы начали с подготовки простого проекта Docker Compose, включающего установку Docker Compose и создание файла docker-compose.yml для определения базового веб-сервиса с использованием образа Nginx.
Затем мы отработали остановку сервисных контейнеров и их последующее удаление с помощью docker compose rm. Мы рассмотрели различные сценарии, включая удаление остановленных контейнеров без томов, удаление остановленных контейнеров с анонимными томами и использование опции принудительного удаления. Этот практический опыт продемонстрировал применение команды docker compose rm для управления жизненным циклом контейнеров в проекте Docker Compose.



