Как использовать команду docker system prune для освобождения дискового пространства

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

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

Введение

В этом лабораторном занятии вы узнаете, как эффективно использовать команду docker system prune для освобождения дискового пространства путем удаления неиспользуемых данных Docker. Сначала мы разберем, что по умолчанию удаляет команда docker system prune, а именно: остановленные контейнеры, неиспользуемые образы (dangling images) и неиспользуемые сети (dangling networks), но не тома (volumes).

Затем вы научитесь удалять неиспользуемые данные Docker, при этом специально исключая тома, а затем узнаете, как удалить все неиспользуемые данные, включая анонимные тома. Наконец, вы научитесь использовать фильтры с командой docker system prune для более точного контроля над тем, какие данные будут удалены.


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(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/SystemManagementGroup -.-> docker/system("Manage Docker") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") subgraph Lab Skills docker/ps -.-> lab-555250{{"Как использовать команду docker system prune для освобождения дискового пространства"}} docker/images -.-> lab-555250{{"Как использовать команду docker system prune для освобождения дискового пространства"}} docker/volume -.-> lab-555250{{"Как использовать команду docker system prune для освобождения дискового пространства"}} docker/system -.-> lab-555250{{"Как использовать команду docker system prune для освобождения дискового пространства"}} docker/prune -.-> lab-555250{{"Как использовать команду docker system prune для освобождения дискового пространства"}} end

Понять, что по умолчанию удаляет команда docker system prune

На этом этапе мы рассмотрим команду docker system prune и узнаем, какие типы неиспользуемых данных Docker она удаляет по умолчанию. Эта команда полезна для очистки дискового пространства путем удаления неиспользуемых или "висящих" (dangling) объектов.

Сначала создадим несколько неиспользуемых объектов Docker. Запустим простой контейнер, а затем остановим его. В результате останется остановленный контейнер и, возможно, "висящий" образ (dangling image), если этот образ не используется другими контейнерами.

Откройте терминал в среде LabEx. Каталог по умолчанию - ~/project.

Запустите простой контейнер hello-world:

docker run hello-world

Вы должны увидеть вывод, показывающий, что Docker-даemon загрузил образ hello-world и запустил контейнер. Контейнер сразу же завершит работу после вывода сообщения.

Теперь выведите список всех контейнеров, включая остановленные:

docker ps -a

Вы увидите контейнер hello-world со статусом "Exited".

Далее выведите список образов:

docker images

Вы должны увидеть образ hello-world.

Теперь запустим команду docker system prune без дополнительных параметров. Это удалит "висящие" образы, "висящие" контейнеры и "висящие" сети. По умолчанию не будут удалены тома (volumes).

docker system prune -f

Мы используем флаг -f, чтобы принудительно удалить объекты без запроса подтверждения.

После выполнения команды вы увидите вывод, показывающий, что было удалено.

Теперь проверим список контейнеров еще раз:

docker ps -a

Остановленный контейнер hello-world должен быть удален.

Проверим список образов еще раз:

docker images

Образ hello-world может по-прежнему присутствовать, если он не считается "висящим" (например, если он был недавно загружен). Однако, если у вас были другие "висящие" образы, они были бы удалены.

Основная идея здесь в том, что команда docker system prune по умолчанию очищает остановленные контейнеры, "висящие" образы и "висящие" сети. Она не удаляет тома, если вы явно не попросите ее сделать это.

Удаление неиспользуемых данных Docker без удаления томов

На предыдущем этапе мы увидели, что по умолчанию команда docker system prune не удаляет тома (volumes). Тома используются для хранения данных, созданных и используемых контейнерами Docker. Непреднамеренное удаление томов может привести к потере данных.

На этом этапе мы покажем, как работает команда docker system prune без удаления томов. Мы создадим том, запустим контейнер, который его использует, остановим контейнер и затем выполним очистку системы. Мы увидим, что том остается после очистки.

Сначала создадим именованный том. Именованные тома явно создаются и управляются Docker.

docker volume create myvolume

Вы должны увидеть имя созданного тома в выводе.

Теперь запустим простой контейнер, который использует этот том. Мы будем использовать образ ubuntu. Если его нет локально, Docker загрузит его.

docker run -d --name mycontainer -v myvolume:/app ubuntu sleep 60

Эта команда запускает контейнер на основе образа ubuntu в фоновом режиме (-d), дает ему имя mycontainer, монтирует том myvolume в каталог /app внутри контейнера и держит контейнер запущенным на протяжении 60 секунд с помощью команды sleep 60.

Проверьте, что контейнер запущен:

docker ps

Вы должны увидеть mycontainer в списке.

Теперь остановите контейнер:

docker stop mycontainer

Контейнер остановится, но останется в остановленном состоянии.

Проверьте, что контейнер остановлен:

docker ps -a

Вы должны увидеть mycontainer со статусом "Exited".

Теперь выведите список томов:

docker volume ls

Вы должны увидеть myvolume в списке.

Теперь снова запустите команду docker system prune. Помните, по умолчанию она не удаляет тома.

docker system prune -f

Посмотрите на вывод. Он должен показать, что остановленный контейнер был удален, но не должен упоминать удаление тома.

Проверьте, что контейнер удален:

docker ps -a

mycontainer больше не должен быть в списке.

Наконец, проверьте, что том по-прежнему существует:

docker volume ls

Вы по-прежнему должны видеть myvolume в списке. Это подтверждает, что по умолчанию команда docker system prune сохраняет тома.

Удаление всех неиспользуемых данных Docker, включая анонимные тома

На предыдущих этапах мы узнали, что по умолчанию команда docker system prune не удаляет тома (volumes). Однако бывают ситуации, когда вам может понадобиться удалить все неиспользуемые данные Docker, включая тома, которые больше не связаны с какими-либо контейнерами. Это особенно полезно для очистки анонимных томов, которые создаются при монтировании каталога внутри контейнера без явного указания имени тома.

Для удаления всех неиспользуемых данных Docker, включая тома, вы можете использовать флаг -a с командой docker system prune. Флаг -a означает "все" и включает тома в процесс очистки.

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

docker run -d --name anothercontainer -v /data ubuntu sleep 60

Эта команда запускает контейнер на основе образа ubuntu с именем anothercontainer и монтирует анонимный том в каталог /data внутри контейнера.

Проверьте, что контейнер запущен:

docker ps

Вы должны увидеть anothercontainer в списке.

Теперь остановите контейнер:

docker stop anothercontainer

Контейнер остановится и перейдет в состояние "остановлен".

Проверьте, что контейнер остановлен:

docker ps -a

Вы должны увидеть anothercontainer со статусом "Exited".

Теперь выведите список томов:

docker volume ls

Вы увидите том myvolume из предыдущего шага и новый том с длинным, случайно сгенерированным именем. Это анонимный том.

Теперь запустите команду docker system prune с флагом -a для удаления всех неиспользуемых данных, включая тома.

docker system prune -a -f

Мы используем -a для включения томов и -f для принудительного удаления без запроса подтверждения.

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

Проверьте, что все контейнеры удалены:

docker ps -a

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

Наконец, проверьте, что все тома удалены:

docker volume ls

В списке не должно быть ни одного тома. Это подтверждает, что команда docker system prune -a удаляет все неиспользуемые данные Docker, включая как именованные, так и анонимные тома.

Удаление данных Docker с использованием фильтров

В дополнение к удалению всех неиспользуемых данных, команда docker system prune позволяет использовать фильтры для выборочного удаления объектов Docker. Это дает вам более детальный контроль над тем, что будет удалено.

Фильтры можно применять к различным типам объектов. Для команды docker system prune можно фильтровать на основе таких критериев, как возраст объектов.

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

Запустим первый контейнер:

docker run -d --name oldcontainer ubuntu sleep 10

Этот контейнер будет работать в течение 10 секунд и затем завершится.

Запустим второй контейнер:

docker run -d --name newcontainer ubuntu sleep 20

Этот контейнер будет работать в течение 20 секунд и затем завершится.

Подождите, пока оба контейнера завершат работу. Вы можете проверить их статус с помощью команды docker ps -a.

docker ps -a

Вы должны увидеть как oldcontainer, так и newcontainer со статусом "Exited".

Теперь используем фильтр для удаления только тех объектов, которые старше определенного времени. Мы можем использовать фильтр until с указанием продолжительности. Например, чтобы удалить объекты, старше 5 секунд, можно использовать until=5s.

Попробуем удалить объекты, старше 15 секунд. Это должно удалить oldcontainer, но сохранить newcontainer (при условии, что вы подождали достаточно долго, чтобы oldcontainer завершил работу, но newcontainer еще не).

docker system prune -f --filter "until=15s"

Посмотрите на вывод. Он должен показать, что oldcontainer был удален, а newcontainer должен остаться.

Проверьте контейнеры:

docker ps -a

Вы должны увидеть newcontainer в списке, а oldcontainer должен быть удален.

Теперь выполним удаление еще раз, на этот раз удалим объекты, старше 30 секунд. Это должно удалить и newcontainer.

docker system prune -f --filter "until=30s"

Посмотрите на вывод. Он должен показать, что newcontainer был удален.

Проверьте контейнеры еще раз:

docker ps -a

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

Фильтры предоставляют мощный способ настройки процесса удаления. Вы можете использовать разные ключи фильтра в зависимости от типа объекта, который вы удаляете (контейнеры, образы, тома, сети). Фильтр until обычно используется для очистки объектов, которые не использовались в течение определенного времени.

Резюме

В этом практическом занятии мы научились использовать команду docker system prune для освобождения дискового пространства путем удаления неиспользуемых данных Docker. Сначала мы изучили поведение команды docker system prune по умолчанию, которая удаляет остановленные контейнеры, "висящие" образы (dangling images) и "висящие" сети (dangling networks). Мы продемонстрировали это, создав и затем удалив остановленный контейнер.

Затем мы рассмотрели, как использовать docker system prune с опциями для управления тем, какие данные будут удалены. Мы научились удалять неиспользуемые данные без удаления томов и как включить анонимные тома в процесс удаления. Наконец, мы обсудили использование фильтров для выборочного удаления данных Docker на основе определенных критериев. В этом практическом занятии мы получили практический опыт использования команды docker system prune для эффективного управления дисковым пространством в среде Docker.