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

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

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

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") 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/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") subgraph Lab Skills docker/run -.-> lab-555117{{"Как использовать команду docker container prune для удаления остановленных контейнеров"}} docker/ps -.-> lab-555117{{"Как использовать команду docker container prune для удаления остановленных контейнеров"}} docker/stop -.-> lab-555117{{"Как использовать команду docker container prune для удаления остановленных контейнеров"}} docker/rm -.-> lab-555117{{"Как использовать команду docker container prune для удаления остановленных контейнеров"}} docker/pull -.-> lab-555117{{"Как использовать команду docker container prune для удаления остановленных контейнеров"}} docker/prune -.-> lab-555117{{"Как использовать команду docker container prune для удаления остановленных контейнеров"}} end

Создание и остановка контейнеров

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

Сначала загрузим Docker-образ, который будем использовать для создания контейнеров. Мы воспользуемся образом ubuntu, представляющим минимальную операционную систему Ubuntu.

docker pull ubuntu

Вы увидите вывод, указывающий на загрузку образа.

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Теперь создадим и запустим контейнер из этого образа с помощью команды docker run. Флаг -d запускает контейнер в detached mode (в фоновом режиме), а флаг --name задаёт имя контейнера.

docker run -d --name my-ubuntu-container ubuntu sleep infinity

Эта команда создаёт контейнер с именем my-ubuntu-container из образа ubuntu и выполняет внутри него команду sleep infinity, которая поддерживает работу контейнера бесконечно.

В выводе вы увидите длинную строку символов — идентификатор контейнера.

<container_id>

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

docker ps

Эта команда выводит список всех запущенных контейнеров. Вы должны увидеть my-ubuntu-container в списке.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container

Теперь создадим ещё один контейнер, но без указания имени. Docker автоматически сгенерирует имя для него.

docker run -d ubuntu sleep infinity

Снова вы увидите идентификатор контейнера в выводе.

<container_id>

Запустим docker ps снова, чтобы увидеть оба работающих контейнера.

docker ps

Теперь в списке должно быть два контейнера.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             <random_name>

Остановим контейнер с именем my-ubuntu-container с помощью команды docker stop, указав имя или ID контейнера.

docker stop my-ubuntu-container

В выводе вы увидите имя контейнера, подтверждающее его остановку.

my-ubuntu-container

Снова выполним docker ps. Контейнер my-ubuntu-container больше не будет отображаться, так как docker ps показывает только работающие контейнеры.

docker ps

Чтобы увидеть все контейнеры, включая остановленные, используем команду docker ps -a.

docker ps -a

Теперь вы увидите оба контейнера, причём у my-ubuntu-container будет статус Exited.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Up X minutes                          <random_name>

Наконец, остановим второй контейнер, используя его ID (возьмите его из вывода docker ps -a). Замените <container_id> на фактический ID второго контейнера.

docker stop <container_id>

В выводе вы увидите ID контейнера.

<container_id>

Выполним docker ps -a в последний раз, чтобы убедиться, что оба контейнера остановлены.

docker ps -a

Теперь у обоих контейнеров должен быть статус Exited.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              <random_name>

Удаление всех остановленных контейнеров

На предыдущем шаге мы создали и остановили два контейнера. Остановленные контейнеры продолжают занимать место на диске и ресурсы. В этом шаге мы научимся удалять все остановленные контейнеры с помощью команды docker container prune.

Сначала выведем список всех контейнеров, включая остановленные, чтобы увидеть контейнеры, которые будем удалять.

docker ps -a

Вы должны увидеть два контейнера, остановленных на предыдущем шаге.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              <random_name>

Теперь удалим все остановленные контейнеры. Команда docker container prune удаляет все остановленные контейнеры.

docker container prune

Docker запросит подтверждение перед удалением контейнеров. Введите y и нажмите Enter для продолжения.

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

Вы увидите вывод с информацией об удалённых контейнерах и общем освобождённом месте.

Deleted Containers:
<container_id>
<container_id>

Total reclaimed space: XMB

Чтобы убедиться, что остановленные контейнеры были удалены, снова выведем список всех контейнеров.

docker ps -a

Теперь вы не должны увидеть никакого вывода, что означает отсутствие контейнеров (как работающих, так и остановленных).

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES

Удаление остановленных контейнеров, созданных до определённого времени

На предыдущем шаге мы научились удалять все остановленные контейнеры. Иногда может потребоваться удалить только те остановленные контейнеры, которые были созданы до определённого момента времени. Это полезно для очистки старых контейнеров при сохранении новых. В этом шаге мы научимся удалять остановленные контейнеры, созданные до определённого времени, используя флаг --filter с фильтром until.

Сначала создадим несколько контейнеров и остановим их, чтобы было что удалять.

docker run -d --name container-old-1 ubuntu sleep infinity
docker run -d --name container-old-2 ubuntu sleep infinity

Подождём несколько секунд, затем создадим ещё один контейнер. Это будет наш "новый" контейнер.

sleep 5
docker run -d --name container-new-1 ubuntu sleep infinity

Теперь остановим все контейнеры.

docker stop container-old-1 container-old-2 container-new-1

Выведем список всех контейнеров, чтобы увидеть их статус и время создания.

docker ps -a --format "{{.Names}}\t{{.Status}}\t{{.CreatedAt}}"

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

container-old-1	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC
container-old-2	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC
container-new-1	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC

Теперь удалим остановленные контейнеры, созданные до определённого времени. Мы будем использовать фильтр until с командой docker container prune. Фильтр until принимает временную метку или продолжительность. В этом примере мы используем продолжительность, указав, что хотим удалить контейнеры, созданные более 10 секунд назад.

docker container prune --filter "until=10s"

Docker запросит подтверждение. Введите y и нажмите Enter.

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

Вы должны увидеть вывод, указывающий, что старые контейнеры были удалены. Новый контейнер не должен быть в списке удалённых.

Deleted Containers:
<container_id_old_1>
<container_id_old_2>

Total reclaimed space: XMB

Чтобы убедиться, что удалены только старые контейнеры, снова выведем список всех контейнеров.

docker ps -a --format "{{.Names}}\t{{.Status}}"

Вы должны увидеть только контейнер container-new-1 со статусом Exited.

container-new-1	Exited (0) X seconds ago

Удаление остановленных контейнеров с определёнными метками

В предыдущих шагах мы научились удалять все остановленные контейнеры и контейнеры по времени создания. В этом шаге мы рассмотрим ещё один полезный способ фильтрации контейнеров для удаления - с использованием меток (labels). Метки представляют собой пары "ключ-значение", которые можно присваивать объектам Docker, включая контейнеры, для их организации и управления.

Сначала создадим несколько контейнеров с разными метками.

docker run -d --name container-label-app --label app=frontend ubuntu sleep infinity
docker run -d --name container-label-env --label env=development ubuntu sleep infinity
docker run -d --name container-no-label ubuntu sleep infinity

Теперь остановим все контейнеры.

docker stop container-label-app container-label-env container-no-label

Выведем список всех контейнеров и их меток, чтобы увидеть применённые метки.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

Вы должны увидеть вывод, похожий на этот:

container-label-app	app=frontend
container-label-env	env=development
container-no-label

Теперь удалим только остановленные контейнеры с меткой app=frontend. Мы будем использовать флаг --filter с фильтром label.

docker container prune --filter "label=app=frontend"

Docker запросит подтверждение. Введите y и нажмите Enter.

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

Вы должны увидеть вывод, указывающий, что контейнер с меткой app=frontend был удалён.

Deleted Containers:
<container_id_app_frontend>

Total reclaimed space: XMB

Чтобы убедиться, что удалён только контейнер с меткой app=frontend, снова выведем список всех контейнеров.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

Теперь вы должны видеть только контейнеры с меткой env=development и без метки.

container-label-env	env=development
container-no-label

Вы также можете удалить контейнеры, которые не имеют определённой метки, используя префикс ! с фильтром метки. Давайте удалим контейнер, не имеющий метки env=development.

docker container prune --filter "label!=env=development"

Подтвердите удаление, введя y и нажав Enter.

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

Вы должны увидеть вывод, указывающий, что контейнер без метки env=development был удалён.

Deleted Containers:
<container_id_no_label>

Total reclaimed space: XMB

В последний раз выведем список всех контейнеров, чтобы убедиться, что остался только контейнер с меткой env=development.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

Вы должны видеть только контейнер container-label-env.

container-label-env	env=development

Итоги

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

  1. Практиковали удаление всех остановленных контейнеров
  2. Удаляли контейнеры, созданные до определённого времени, используя параметр --filter until
  3. Выборочно удаляли контейнеры на основе меток с помощью параметра --filter label

Эти шаги продемонстрировали практические методы управления и очистки остановленных контейнеров в среде Docker.