Как использовать команду docker compose rm для удаления остановленных контейнеров

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

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

Введение

В этой лабораторной работе вы научитесь использовать команду docker compose rm для удаления остановленных контейнеров. Мы начнём с подготовки простого проекта Docker Compose, который включает установку Docker Compose и создание файла docker-compose.yml для определения базового веб-сервиса.

После настройки проекта вы попрактикуетесь в остановке сервисных контейнеров. Основная часть лабораторной работы посвящена использованию docker compose rm для удаления этих остановленных контейнеров, рассматривая сценарии без томов (volumes), с анонимными томами (anonymous volumes) и, наконец, демонстрации принудительного удаления контейнеров.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/ps -.-> lab-555090{{"Как использовать команду docker compose rm для удаления остановленных контейнеров"}} docker/stop -.-> lab-555090{{"Как использовать команду docker compose rm для удаления остановленных контейнеров"}} docker/rm -.-> lab-555090{{"Как использовать команду docker compose rm для удаления остановленных контейнеров"}} docker/pull -.-> lab-555090{{"Как использовать команду docker compose rm для удаления остановленных контейнеров"}} docker/volume -.-> lab-555090{{"Как использовать команду docker compose rm для удаления остановленных контейнеров"}} end

Подготовка простого проекта 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.