Перейти к основному содержимому

Docker — удаление висящих и неиспользуемых образов

· 5 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим некоторые причины, по которым висящие и неиспользуемые изображения распространены в Docker . Затем мы рассмотрим некоторые способы их удаления.

Хорошей практикой является время от времени очищать висящие и неиспользуемые образы Docker, поскольку большое количество неиспользуемых образов может привести к пустой трате места на диске.

2. Неиспользуемые объекты в Docker

Docker не удаляет неиспользуемые объекты автоматически. Вместо этого он сохраняет их на диске до тех пор, пока мы явно не попросим его удалить их. Некоторые неиспользуемые объекты:

  • Каждое извлеченное изображение, не имеющее активного контейнера
  • Каждый контейнер с остановленным статусом
  • Объемы, соответствующие остановленным и удаленным контейнерам
  • Строить кеши

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

2.1. Висячие образы Docker

Висячие изображения создаются, когда мы перезаписываем их новым изображением с тем же именем и тегом.

Давайте рассмотрим небольшой пример того, как обновление изображения приведет к зависанию изображения. Ниже приведен простой Dockerfile:

FROM ubuntu:latest
CMD ["echo", "Hello World"]

Давайте создадим это изображение:

docker build -t my-image .

Мы можем убедиться, что образ создан, выполнив следующую команду:

docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-image latest 7ed6e7202eca 32 seconds ago 72.8MB
ubuntu latest 825d55fb6340 6 days ago 72.8MB

Предположим, мы добавим небольшое изменение в Dockerfile:

FROM ubuntu:latest
CMD ["echo", "Hello, World!"]

Давайте пересоберем образ, используя ту же команду, что и раньше, и снова выведем список образов:

docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-image latest da6e74196f66 4 seconds ago 72.8MB
<none> <none> 7ed6e7202eca About a minute ago 72.8MB
ubuntu latest 825d55fb6340 6 days ago 72.8MB

Сборка создала новый образ my- image. Как мы видим, старое изображение все еще там, но теперь оно болтается. Его имя и тег установлены на <none>:<none> .

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

2.2. Неиспользуемые образы Docker

Неиспользуемые образы — это образы, с которыми не связан работающий или остановленный контейнер.

Примеры неиспользуемых изображений:

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

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

3. Удаление ненужных изображений

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

3.1. Удаление изображений по идентификатору или имени

Если мы знаем идентификатор образа, мы можем использовать команду docker rmi для удаления образа.

docker rmi 7ed6e7202eca

Эта команда удалит изображение с идентификатором 7ed6e7202eca (висячее изображение). Давайте перепроверим изображения:

docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-image latest da6e74196f66 18 minutes ago 72.8MB
ubuntu latest 825d55fb6340 6 days ago 72.8MB

В качестве альтернативы мы можем использовать команду docker rmi с именем и тегом образа, если мы хотим удалить определенный неиспользуемый образ:

docker rmi my-image:latest

3.2. Удаление образа Docker

Если мы не хотим находить оборванные изображения и удалять их по одному, мы можем использовать команду docker image prune . Эта команда удаляет все висящие изображения.

Если мы также хотим удалить неиспользуемые изображения, мы можем использовать флаг -a .

Давайте запустим следующую команду:

docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y

Команда вернет список ID изображений, которые были удалены, и место, которое было освобождено.

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

3.3. Удаление системы Docker

Поиск и удаление всех неиспользуемых объектов может быть утомительным. Чтобы упростить задачу, мы можем использовать команду docker system prune .

Эта команда по умолчанию удалит следующие объекты:

  • Остановленные контейнеры — контейнеры в остановленном состоянии.
  • Сети, которые не используются хотя бы одним контейнером
  • Висячие изображения
  • Висячий кеш сборки - кеш сборки, поддерживающий висячие изображения.

Кроме того, мы можем добавить флаг -a , чтобы удалить все неиспользуемые контейнеры, образы, сети и весь кеш сборки. Это полезно, когда мы хотим освободить много места.

Давайте посмотрим на пример этого:

docker system prune -a
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all images without at least one container associated to them
- all build cache

Are you sure you want to continue? [y/N]

4. Вывод

В этом уроке мы рассмотрели, почему висящие и неиспользуемые изображения распространены в Docker. Мы также рассмотрели способы их удаления с помощью команд rmi, image prune и system prune .