Если вы продолжите создавать образы докеров, у вас скоро начнется заканчиваться свободное место. Удаление старых и неиспользуемых образов Docker освободит для вас много места на диске.
В этой статье мы расскажем о различных сценариях удаления образов Docker из вашей системы.
Сначала проверьте образы Docker, присутствующие в вашей системе, с помощью этой команды:
docker images
На выходе будут показаны все изображения Docker и их идентификаторы. Вам нужно имя изображения (в столбце репозитория) или идентификатор изображения, чтобы удалить образ докера из вашей системы.
andreyex@destroyer:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE debian latest 67e34c1c9477 2 weeks ago 114MB ubuntu latest 775349758637 6 weeks ago 64.2MB
С помощью идентификатора изображения вы можете удалить образ Docker следующим образом:
docker rmi image_name_or_id
Вы также можете использовать следующую команду, так как они одинаковы:
docker image rm image_id
Вот как может выглядеть вывод:
andreyex@destroyer:~$ docker rmi 67e34c1c9477 Untagged: debian:latest Untagged: debian@sha256:79f0b1682af1a6a29ff63182c8103027f4de98b22d8fb50040e9c4bb13e3de78 Deleted: sha256:67e34c1c9477023c0ce84c20ae5af961a6509f9952c2ebbf834c5ea0a286f2b8 Deleted: sha256:f2b4f0674ba3e6119088fe8a98c7921ed850c48d4d76e8caecd7f3d57721b4cb
Если вы используете идентификатор изображения, он удалит все изображения, связанные с этим идентификатором.
Жизнь была бы намного проще, если бы вы могли просто удалить образы Docker. Но случается это не часто.
Если у вас есть контейнеры, связанные с образом Docker, вы столкнетесь с некоторыми ошибками при попытке удалить изображение.
andreyex@destroyer:~$ docker rmi 775349758637 Error response from daemon: conflict: unable to delete 775349758637 (cannot be forced) - image is being used by running container 13dc0f4226dc
Сначала вы должны остановить контейнер:
andreyex@destroyer:~$ docker stop 13dc0f4226dc 13dc0f4226dc
Проблема в том, что даже если вы остановите контейнер, он все равно будет выдавать ошибку, если вы попытаетесь удалить изображение:
andreyex@destroyer:~$ docker rmi 67e34c1c9477 Error response from daemon: conflict: unable to delete 67e34c1c9477 (must be forced) - image is being used by stopped container 5ced86b1fcee
У вас есть два варианта здесь:
Чтобы принудительно удалить образ Docker, вы можете использовать опцию -f:
docker rmi -f image_id
Чтобы удалить контейнер, а затем удалить изображение, вы можете использовать что-то вроде этого:
docker rm container_id docker rmi image_id
Жизнь все равно была бы немного проще, если бы изображение Docker было связано только с одним контейнером. Но с изображением может быть связано несколько контейнеров, и удаление такого рода изображения Docker становится проблемой.
Вы увидите ошибку, подобную этой:
andreyex@itsfoss:~$ docker rmi 775349758637 Error response from daemon: conflict: unable to delete 775349758637 (must be forced) - image is referenced in multiple repositories
Во-первых, вам нужно найти все контейнеры, связанные с именем изображения (не ID).
docker ps -a -q --filter ancestor=docker_image_name
И тогда вам нужно остановить их всех. Вы можете использовать идентификаторы контейнеров один за другим, но это займет слишком много времени. Вы можете использовать магию pipe и xargs, чтобы остановить все контейнеры, связанные с изображением:
docker ps -a -q --filter ancestor=ubuntu | xargs docker stop
И тогда вы можете либо удалить остановленные контейнеры, либо принудительно удалить изображение (как вы видели в предыдущем разделе).
Если вы хотите удалить все контейнеры, связанные с изображением, просто запустите эту команду:
docker ps -a -q --filter ancestor=ubuntu | xargs docker rm
И теперь вы можете удалить образ Docker с помощью команды, показанной ранее в этой статье.
Вы также можете удалить несколько образов Docker в одной команде. Это так же, как предыдущая команда. Вам просто нужно указать идентификаторы изображений или имена изображений.
docker rmi image_id_1 image_id_2 image_id_3
Конечно, вам придется остановить все запущенные контейнеры, связанные с изображениями.
Прежде чем вы увидите это, позвольте нам объяснить, что такое неиспользуемые и висящие изображения:
Любой образ Docker, с которым связаны любые типы контейнеров (остановлен или запущен), является используемым образом. Если с изображением Docker не связаны контейнеры, он становится неиспользуемым изображением Docker.
Висящий образ Docker означает, что вы создали новую сборку образа, но ему не дали новое имя. Таким образом, старые образы, которые у вас есть, становятся висящими. Эти старые изображения являются непомеченными и отображают <none> в своем имени, когда вы запускаете команду ‘docker images’.
Если вы хотите удалить висячие образы, вы можете использовать опцию prune:
docker image prune
Если вы хотите удалить неиспользуемые и висящие изображения одновременно, вы можете использовать prune с параметром -a:
docker image prune -a
Вы должны увидеть пространство, которое он освобождает в конце вывода:
andreyex@destroyer:~$ 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 Deleted Images: untagged: ubuntu:latest untagged: ubuntu@sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d untagged: debian:latest untagged: debian@sha256:79f0b1682af1a6a29ff63182c8103027f4de98b22d8fb50040e9c4bb13e3de78 deleted: sha256:67e34c1c9477023c0ce84c20ae5af961a6509f9952c2ebbf834c5ea0a286f2b8 deleted: sha256:f2b4f0674ba3e6119088fe8a98c7921ed850c48d4d76e8caecd7f3d57721b4cb untagged: fedora:latest untagged: fedora@sha256:d4f7df6b691d61af6cee7328f82f1d8afdef63bc38f58516858ae3045083924a deleted: sha256:f0858ad3febdf45bb2e5501cb459affffacef081f79eaa436085c3b6d9bd46ca deleted: sha256:2ae3cee18c8ef9e0d448649747dab81c4f1ca2714a8c4550eff49574cab262c9 Total reclaimed space: 308.3MB
Вы можете быть немного умнее с командой prune и удалять только старые неиспользуемые и висящие изображения. Так что если вы хотите удалить те, которые старше 24 часов, используйте это так:
docker image prune -a --filter "until=24h"
Возможно, вы находитесь в среде тестирования и хотите начать заново, удалив все образы Docker.
Чтобы удалить все образы Docker, вам необходимо сначала остановить все работающие контейнеры.
docker ps -a -q | xargs docker rm
Теперь вы можете удалить все изображения следующим образом:
docker images -a -q | xargs docker rmi -f
Вот и все. Мы думаем, что достаточно справочного материала для удаления образов Docker, и вы должны лучше понять эту тему.
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте комментарий ниже.