• База знаний
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Статья также доступна на украинском (перейти к просмотру).

Пошаговая инструкция по очистке Docker: как удалить images, контейнеры и volumes и освободить место на сервере

Содержание:

Многим знакома ситуация, когда на сервере вдруг заканчивается свободное место за счет того, что Docker занимает десятки гигабайт и постоянно расширяется. Проверка системы с помощью команд docker system df и df -h при этом дает противоречивые результаты, и поэтому пользователь не понимает, что именно нужно удалять. Сущность проблемы заключается в сложном строении файловой системы (layered filesystem) и особенностях организации хранения данных в Docker. Владея базовой информацией по механизмам хранения данных в Docker, можно предотвратить возникновение критической ситуации и повысить производительность системы. Рассмотрим базовые понятия, а также методы анализа и очищения Docker от лишних и/или неиспользованных данных. 

Рекомендуем ознакомиться со статьей "Заканчивается место на VPS: как найти, что занимает диск в Ubuntu".

Где Docker хранит данные

В среде Linux стандартным местом хранения всех данных является корневой каталог /var/lib/docker/. Каталог содержит ряд подкаталогов для разных типов данных. Рассмотрим ключевые из них:

Overlay2 – стандартный драйвер хранилища в Linux или storage driver, управляющий хранением контейнеров и шаблонов на Docker-узле.

Containers – контейнеры представляют собой автономные приложения или сервисы, временно созданные на базе шаблонов image. В контексте Linux они являются изолированными процессами, которые можно создать в любой момент времени, запустить, остановить или удалить.

Volumes – тома определяют место хранения данных (локальное или внешнее), независимо от файловой системы контейнера.

Image – шаблоны содержат функциональные зависимости, библиотеки и другие данные, необходимые для обеспечения автономной работы контейнеров. Они многослойные, где каждый уровень фиксирует определенные изменения файловой системы контейнера.

Buildkit – кэш сборки или Build Cache, который генерируется во время сборки шаблона.

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

Удаление контейнера не удаляет шаблон, на основе которого он создан, а только ликвидирует временно созданный изолированный процесс;

  • Удаление шаблона не удаляет объем, а только ликвидирует данные и контекст сборки определенной контейнерной среды;

  • При работе контейнеров, как и любых других процессов, выполняется логирование, и, соответственно, логи контейнеров также занимают на диске место.  

Как проверить, что именно занимает место

Для демонстрации и лучшего понимания процесса обнаружения и удаления лишних данных нам понадобится собственный Docker-шаблон. Создадим его с помощью приведенных ниже команд.

Создадим каталог, который в дальнейшем станет контекстом сборки для нашего шаблона:

$ mkdir dock
$ cd dock 

В каталоге dock создадим файл с именем dockerfile и разместим в нем следующий код:

$ sudo nano dockerfile 

FROM python:latest  //Определение данных шаблона
RUN mkdir -p /usr/myproject///Создание директории
WORKDIR /usr/myproject/ //Установление рабочей директории проекта
CMD ["python", "main.py"]//Определение команды на старте контейнера 

После сохранения внесенных изменений соберем шаблон с именем my_app:v1с помощью команды:

$ sudo docker build . -t my_app:v1

Здесь опция -t позволяет указать имя шаблона, а символ «.» перед ней указывает текущий каталог в качестве контекста сборки. .

Сокращенный выход команды:

[+] Building 79.9s (7/7) FINISHED                                                                                  docker:default
 => [internal] load build definition from dockerfile                                                                  0.7s
 => => transferring dockerfile: 137B                                                                                     0.0s
 => [internal] load metadata for docker.io/library/python:latest                                         3.4s
 => [internal] load .dockerignore                                                                                            0.6s
 => => transferring context: 2B                                                                                             0.0s
 => [1/3] FROM docker.io/library/python:latest@sha256:151ab3571dad616bb031052e86411e2165295c7f67ef27206852203e854bcd12                                                                                                     67.3s
 => => resolve
.....................................................................................................................................
....................................................................................................................................
sha256:48adf976412b12c3683dd37d9d0ccd7e8dc20a70e8a80f20d35ddd70bc088838    0.1s
 => => naming to docker.io/library/my_app:v1                                                                     0.0s
 => => unpacking to docker.io/library/my_app:v1                                                                0.4
Переглянути список шаблонів, котрі є у нашій системі можна за допомогою команди: 
$ sudo docker image ls
IMAGE                 ID                              DISK USAGE   CONTENT SIZEEXTRA
hello-world:latest05813aedc15f          25.9kB           9.52kB               U
my_app:v1          48adf976412b          1.61GB             414MB

Кроме созданного нами my_app:v1 здесь также присутствует шаблон hello-world:latest.

Столбцы DISK USAGE и CONTENT SIZE предоставляют информацию о местоположении на диске в целом и по размеру контента.

Нередко может оказаться полезной подробная информация по каждому из слоев шаблона, в частности, для определения занимаемых ими мест. Провести такой анализ можно с помощью команд  docker history и docker inspect..

Продемонстрируем это:

$ sudo docker history my_app:v1 
IMAGE      CREATED       CREATED BY                       SIZE     COMMENT
48adf976412b   41 hours ago   CMD ["python" "main.py"]     0B    buildkit.dockerfile.v0
<missing>  41 hours ago   WORKDIR /usr/myproject/    4.1kB buildkit.dockerfile.v0
<missing>  41 hours ago   RUN /bin/sh -c mkdir -p /usr/myproject/ # bu…   12.3kBbuildkit.dockerfile.v0
<missing>  11 days agoCMD ["python3"]                     0B    buildkit.dockerfile.v0
<missing>  11 days agoRUN /bin/sh -c set -eux;  for src in idle3 p…   16.4kB    buildkit.dockerfile.v0
<missing>  11 days agoRUN /bin/sh -c set -eux;   savedAptMark="$(a…   82.2MB    buildkit.dockerfile.v0
<missing>  11 days agoENV PYTHON_SHA256=a97d5549e9ad81fe17159ed02c…   0B    buildkit.dockerfile.v0
<missing>  11 days agoENV PYTHON_VERSION=3.14.3                      0B    buildkit.dockerfile.v0
<missing>  11 days agoRUN /bin/sh -c set -eux;  apt-get update;  a…   19.9MBbuildkit.dockerfile.v0
<missing>  11 days agoENV PATH=/usr/local/bin:/usr/local/sbin:/usr…   0B    buildkit.dockerfile.v0
<missing>  13 days agoRUN /bin/sh -c set -ex;  apt-get update;  ap…   694MB buildkit.dockerfile.v0
<missing>  13 days agoRUN /bin/sh -c set -eux;  apt-get update;  a…   202MB buildkit.dockerfile.v0
<missing>  13 days agoRUN /bin/sh -c set -eux;  apt-get update;  a…   65MB  buildkit.dockerfile.v0
<missing>  2 weeks ago# debian.sh --arch 'amd64' out/ 'trixie' '@1…   134MB debuerreotype 0.17

С помощью команды history можно получить информацию об идентификаторе шаблона; время его создания; команды, которые использовались для каждого слоя; размер; сообщение от драйвера кэша.

Другую информацию можно получить с помощью команды проверить:

$ sudo docker inspect --format '{{json .RootFS.Layers}}' my_app:v1

Здесь мы форматировали выход команды с помощью пользовательского шаблона json. Результаты выполнения приведены ниже.

["sha256:d16566b6c5a6bd5c45da221a2fc94937d8d503c920c8627f154a2f8a57537da4","sha256:3dc84f17a3999c0ab5fc2ef9c360dde19a663f4c22cbcec9e1b507fa3ca4222d","sha256:222b6d2e7e9f54c3f0013d281f37408ecd1c690fba9b7230138187da42415cf6","sha256:05f2b78449c812b7301720f11a1a2e4c2b8fc0229e2433b9aa0b619f2cade10a","sha256:96fc0777a58100b18b903a7e88704df66e8e9272647a732271287def69586a9a","sha256:5b1da75dbec265d08f3518d63dc6ec9317d4196024302d4724ce775648b5b362","sha256:c2bc34f33e3a3d9fc75b76bc4bf8c29b62e7c9ccc26f0ce610487f7efa0eb1bc","sha256:d990813ef0375de95e633fc39b5ec62185a4594b42dcf4b3306c8e58e12ebe08","sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"]

Мы получили девять слоев шаблона my_app:v1 в виде хешей SHA256. Каждый шаблон имеет криптографический хэш или дайджест, основанный на содержании его слоев. При отправке или загрузке шаблона дайджест используется для контроля его целостности.  

Просмотр потребления памяти Docker в файловой системе хоста можно так: 

$ sudo docker system df
TYPE              TOTAL      ACTIVE       SIZE           RECLAIMABLE
Images            2              1                  1.611GB           104.6kB (0%)
Containers      1              0                 4.096kB            4.096kB (100%)
Local Volumes 0              0                     0B                     0B
Build Cache   11            0                 1.611GB          12.29kB

Команда предоставляет информацию об использовании диска Docker в нескольких категориях: шаблоны, контейнеры, локальные тома и кэш сборки.

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

Та же команда с опцией -в дает результаты в более расширенном формате:

$ sudo docker system df -v
Images space usage:
REPOSITORYTAG   IMAGE ID   CREATED    SIZE  SHARED SIZE   UNIQUE SIZE   CONTAINERS
my_app    v1    48adf976412b   42 hours ago   1.61GB    0B        1.611GB   0
hello-world   latest05813aedc15f   6 months ago   25.9kB    0B        25.9kB    1
Containers space usage:
CONTAINER ID   IMAGE     COMMANDLOCAL VOLUMES   SIZE      CREATED   STATUS               NAMES
e9420d894d77   hello-world   "/hello"   0           4.1kB 12 days ago   Exited (0) 12 days ago   cool_cray
Local Volumes space usage:
VOLUME NAME   LINKS SIZE
Build cache usage: 1.611GB
CACHE ID  CACHE TYPE  SIZE               CREATED    LAST USED USAGE     SHARED
ocbvf7mtbt5v   regular             183MB 42 hours ago   42 hours ago 1            true
h0ybalxd04nz   regular             90.6MB42 hours ago   42 hours ago 1            true
s7vqc0xwa076   regular           270MB 42 hours ago   42 hours ago  1            true
3264z8l74jf5regular             930MB 42 hours ago   42 hours ago   1           true
y73i1rof03sxregular                       26MB    42 hours ago   42 hours ago   1           true
v6j7jnhvxxa2   regular                       112MB             42 hours ago   42 hours ago    1            true
som9zatjipwv   regular                    16.5kB           42 hours ago   42 hours ago      1           true
a7bkawsvjwdh   regular                  4.13kB          42 hours ago   42 hours ago      1           true
u2hirnr07j61   source.local             8.19kB            42 hours ago   42 hours ago      1           false
xa5bfnuj4lpg   source.local           4.1kB              42 hours ago   42 hours ago        1          false
dfyl3902roiu   regular                  16.6kB            42 hours ago   42 hours ago       1          true

Также может быть полезна команда, которая выводит информацию об использовании дискового пространства стандартными и монтируемыми каталогами. Linux:

$ sudo df -h
Filesystem  Size     UsedAvail Use%    Mounted on
udev           2.4G 0         2.4G  0%         /dev
tmpfs         480M1.8M   478M 1%    /run
/dev/vda2   38G      7.7G   29G    22%      /
tmpfs         2.4G 0          2.4G   0%   /dev/shm
tmpfs         5.0M 0          5.0M  0%  /run/lock
tmpfs         480M 0         480M 0%  /run/user/ 

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

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

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

$ sudo docker system df
TYPE              TOTAL      ACTIVE       SIZE           RECLAIMABLE
Images            2            2                  1.611GB      1.611(100%)
Containers      3              0                 86.02kB       86.02kB (100%)
Local Volumes 0              0                 0B               0B
Build Cache   11            0                 1.611GB     12.29kB

Первый раз контейнеры занимали только 4,096 kB, а теперь 86,02 kB, то есть, в 20 раз больше. Удалив лишние, мы освободим место на диске. Но для этого мы должны знать ID или имя контейнера.

Вывести список всех имеющихся в системе контейнеров (активных и остановленных) можно с помощью команды:

$ sudo docker ps -a
CONTAINER ID   IMAGE         COMMAND        CREATED      STATUS                  PORTS NAMES
074b6bc4f4a0my_app:v1 "python main.py"   17 minutes ago   Exited (2) 17 minutes ago         focused_jemison
bd59f1999239   hello-world   "/hello"       24 minutes ago   Exited (0) 24 minutes ago         hardcore_shirley
e9420d894d77   hello-world   "/hello"       12 days ago  Exited (0) 4 minutes ago          cool_cray

 exited (выполнен выход). В таком случае команда ps  будет выглядеть следующим образом:

$ sudo docker ps -a -f status=exited

Здесь мы использовали опцию -f для выполнения операции фильтрации.

Теперь мы сможем контролировать ситуацию.

К примеру, удалим контейнер со статусом вздохнул, созданный на базе шаблона my_app:v1.

Останавливаем его:

$ sudo docker stop 074b6bc4f4a0

В случае успешного выполнения на выходе получим его идентификатор:

074b6bc4f4a0

Удаляем:

$ sudo docker rm 074b6bc4f4a0
 074b6bc4f4a0

Удалить все остановленные контейнеры можно с помощью команды:

$ sudo docker container prune
 WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
5e34c067f59c27fe8eb196ee3d5fba09d87b246ebcf00368db51c7f62d749602
6e3f084c1f8097afe82e5241f11811476b7a488f3b1059d1d644ee9e87ad0a8a
00a688034a328c410cb02ea2ee48e800d97e5251aed221c465bb663c9414a3f3
bd59f19992393c4365f3514adc86a657ea940e7618412061616e3d7fb46aaca6
e9420d894d775e01ae0a041d2f11a083987d2f93256fecc458916db1977c7725
Total reclaimed space: 94.21kB 

Одним из путей оптимизации расхода дискового пространства может стать использование опции –rm при запуске контейнеров, обеспечивающей их автоматическое удаление на выходе.

Пример команды:

$ docker run --rm <имя шаблона>

Удаление шаблонов

Со временем в процессе работы накапливается немало неиспользуемых шаблонов. (unused) и тех, кто находится во взвешенном состоянии или, как говорится, зависшие шаблоны (dangling).

Первые из них не используются ни одним контейнером (активным или остановленным). У других нет тега и имени репозитория и в списках шаблонов отображаются как <none>:<none>. Все они вместе могут занимать значительный объем дискового пространства и поэтому нуждаются в удалении.  

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

Приведем примеры некоторых команд.

Удаление dangling-шаблонов:

$ docker images -f dangling=true
$ docker image prune

Удаление определенного шаблона по его ID:

$ docker rmi <image id>

Удаление всех шаблонов, к которым не привязан ни один контейнер (dangling + unused):

$ 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]

После подтверждения своего согласия на удаление операция будет исполнена.

Поиск и удаление по определенному шаблону с помощью оператора схватить:

$ docker images -a | grep "pattern"

Удаление volume

Томы являются местом хранения данных и могут быть нескольких типов: анонимные, именуемые и Bind Mounts (связаны с хостом). Приведем главные команды для работы с томами.

Вывести список всех зарегистрированных в системе томов.

 $ sudo docker volume ls
Результат может быть следующим:
#DRIVER        VOLUME NAME
#local               b45436c7f8bab37c0bfe998f

Удаление одного или нескольких томов по их имени, при условии, что они не используются ни одним контейнером:

$ docker volume rm [OPTIONS] VOLUME [VOLUME...]

Удаление всех неиспользуемых локальных томов (Unused):

$ docker volume prune

Следует отметить, что тома содержат реальные данные и поэтому их удаление означает удаление данных проекта. В частности, они могут содержать БД.

Очистка build cache

Просматривая результаты выполнения команды docker system df , мы уже обращали внимание, что содержимое Создать кэш занимает на диске не меньше места, чем все имеющиеся в системе шаблоны (Build cache usage: 1.611GB). И это понятно, поскольку кэш используется для оптимизации производительности. Docker за счет кэширования данных шаблонов. С другой стороны это может перезагрузить диск, что особенно ощутимо при частом выполнении операций сборки. Для этого необходимо периодически выполнять его очищение.

Рассмотрим использование нескольких команд.

Первая команда:

$ sudo docker builder prune
WARNING! This will remove all dangling build cache. Are you sure you want to continue? [y/N]

Команда предлагает удалить все dangling-данные кэша, которые не привязаны ни к одному шаблону с тегом. Для их удаления достаточно подтвердить операцию. 

Вторая команда:

$ sudo docker builder prune

WARNING! This will remove all dangling build cache. Are you sure you want to continue? [y/N]

Команда выполняет полную очистку кэша при подтверждении операции.

Полная очистка Docker

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

$ sudo docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - unused build cache
Are you sure you want to continue? [y/N]

Команда удаляет все остановленные контейнеры; взвешенные шаблоны; сети, не привязанные ни к одному контейнеру; данные кэша, которые не используются. 

$ sudo docker system prune -a 
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all anonymous volumes 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]

Команда удаляет все остановленные контейнеры; все сети и шаблоны, которые не привязаны ни к одному контейнеру; весь кэш сборника. 

$ sudo docker system prune -a --volumes 
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all anonymous volumes 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] 

Команда удаляет все остановленные контейнеры; все сети, анонимные тома и шаблоны, которые не привязаны ни к одному контейнеру; весь кэш сборника. 

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

Docker Compose

Рассмотрим эффективный инструмент для корректного завершения работы и очистки сетей, контейнеров, томов и шаблонов Docker. Это команда docker Compose Down. В отличие от нее, команда docker Compose Stop только останавливает контейнеры, не трогая их содержимое.

При применении команды на практике можно получить следующий результат:

$ docker-compose down
Stopping docker-compose-mydemo_cont ... done
Removing docker-compose-mydemo_cont ... done
Removing network docker-compose-mydemo_def
Network testnet is external, skipping

Network testnet is external, skipping

По результатам ее выполнения можно сделать следующие выводы:

  • Останавливаются и удаляются все контейнеры, указанные в файле Docker Compose;

  • Удаляются все внутренние сети, созданные Docker Compose;

  • Том с данными не удаляются. 

Теперь применим ее с опцией  --volumes (-v):

$ docker-compose down --volumes
Stopping docker-compose-mydemo_cont ... done
Removing docker-compose-mydemo_cont ... done
Removing network docker-compose-mydemo_def
Network testnet is external, skipping
Removing volume docker-compose-mydemo_data 

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

Логи контейнеров

Как уже отмечалось, осуществляется логирование каждого контейнера, причем, как внутри, так и снаружи.VPS-хосты. Стандартный путь для их хранения: /var/lib/docker/containers/.log.

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

Вывести логи из определенного контейнера можно с помощью команды: 

$ docker logs -f <container ID>

При этом контейнер может быть как активным, так и остановленным. 

Найти файл логов на хосте можно с помощью команды:

$ docker container inspect <container ID> | grep LogPath

Вывести его содержимое:

$ cat $(docker inspect --format "{{.LogPath}}" <container ID>)

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

$ sudo sh -c 'echo "" > $(docker inspect --format="{{.LogPath}}" <container ID>)' 

Большинство драйверов логирования Docker поддерживают ротацию логов. Ее можно включить глобально или отдельно для каждого контейнера. Стандартно ее глобальное включение и настройку можно выполнить в файле /etc/docker/daemon.json. Пример кода приведен ниже.

{
"log-opts": {
    "max-size": "7m",
    "max-file": "3"
}
}

Здесь логи контейнеров ротируются сразу по достижении ими размера 7 МБ. В каждый момент времени может храниться до трех файлов.

После сохранения внесенных изменений следует перезапустить главный процесс Docker:

$ systemctl restart docker

Рекомендации для VPS

Предоставим основные рекомендации по предотвращению загрязнения Docker-среды вашего хоста:

  • Регулярно проверять docker system df;

  • Включить лог-ротацию;

  • Использовать --rm для временных контейнеров;

  • Выносить данные на отдельный диск;

  • Не удалять вручную каталог /var/lib/docker

Выводы

Основные выводы по теме:

  • Docker хранит данные слоями;

  • Контейнеры, шаблоны и volumes – разные сущности;

  • Очистка должна быть осознанной;

  • Важно понимать, что именно удаляется.

Подписывайтесь на наш Telegram-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов

Смотрите наш канал YouTube на https://www.youtube.com/freehostua.

Мы в чем ошиблись, или что-то пропустили?

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

Дата: 20.02.2026
Автор: Александр Ровник
Голосование

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:

comments powered by Disqus
navigate
go
exit
Спасибо, что выбираете FREEhost.UA