Як ефективно видаляти образи, контейнери та томи Docker?
Docker спрощує пакування ваших застосунків і сервісів у контейнери, роблячи їх переносними та простими в розгортанні. Однак у міру використання Docker зазвичай накопичується багато невикористовуваних образів, контейнерів і томів. Вони можуть захаращувати ваше середовище та займати цінне місце на диску.
На щастя, Docker має різні вбудовані інструменти, які допомагають керувати системою та очищати її безпосередньо з командного рядка.
У цьому гайді ми покроково розповімо, як видаляти образи Docker, а також інші невикористовувані ресурси, як-от контейнери й томи. Виконавши описані кроки, ви навчитеся ефективно очищати середовище Docker, звільняти цінне місце на диску та підтримувати порядок у системі.
Як видалити образи, контейнери, томи та мережі Docker? (Покроковий гайд)
Docker пропонує одну команду для видалення всіх образів Docker та інших ресурсів, зокрема контейнерів, томів і мереж, які не мають тегів або не пов'язані з жодним контейнером.
docker system prune
Наведена вище команда очищає невикористовувані ресурси Docker, видаляючи контейнери Docker, «завислі» (dangling) образи, невикористовувані томи та мережі, не підключені до жодного контейнера. За замовчуванням вона видаляє лише ті ресурси, які безпечно видаляти. Додавання прапорця --all дає змогу видалити всі невикористовувані образи, а не лише «завислі».
Щоб видалити контейнер Docker, який зараз не запущений, і всі невикористовувані образи (зокрема ті, що не є «завислими»), додайте до команди прапорець -a.
docker system prune -a
Видалення образів Docker
Щоб видалити конкретні образи, спочатку скористайтеся командою docker images з прапорцем -a. Вона покаже всі образи, зокрема проміжні шари, і дасть змогу визначити ID образів, які ви хочете видалити.
docker images -a
Визначивши потрібні образи, видаліть їх командою docker rmi, вказавши їхній ID або тег.
docker rmi Image Image
Видалення «завислих» образів Docker
Образи Docker складаються з кількох шарів, а «завислі» образи - це шари, не пов'язані з жодним образом із тегом. Такі шари непотрібні й займають місце на диску.
Якщо ви збираєте образ без призначення тегу, він відображатиметься як «завислий», оскільки не пов'язаний із жодним образом із тегом. Щоб цього уникнути, завжди вказуйте тег під час збирання образу. Також можна додати тег до наявного образу пізніше за допомогою команди docker tag.
Знайти їх можна командою docker images з прапорцем -f і значенням dangling=true. Переконавшись, що хочете їх видалити, скористайтеся командою docker image prune, щоб видалити «завислі» образи.
docker images -f dangling=true
Тепер ви можете видалити ці образи за допомогою наведеної нижче команди:
docker image prune
Видалення всіх образів
Переглянути всі образи Docker у системі можна за допомогою команди docker images з прапорцем -a.
docker images -a
Вирішивши їх видалити, додайте прапорець -q, щоб вивести лише ID образів, які потім можна передати команді docker rmi для видалення.
docker rmi $(docker images -a -q)
Видалення образів за певним шаблоном
Щоб видалити образи за певним шаблоном, можна поєднати команду docker images і grep для фільтрування образів.
docker images -a | grep "pattern"
Визначивши образи, скористайтеся awk, щоб витягти їхні ID, і передайте їх команді docker rmi для видалення. Майте на увазі, що ці утиліти не вбудовані в Docker і можуть бути доступні не в усіх системах.
docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi
Видалення контейнерів Docker
Щоб видалити конкретні контейнери, скористайтеся командою docker ps з прапорцем -a, щоб вивести список усіх контейнерів.
docker ps -a
Наведена вище команда дасть змогу знайти імена або ID контейнерів, які ви хочете видалити. Перед видаленням контейнера може бути корисно спочатку перевірити, що в ньому, відкривши інтерактивну оболонку за допомогою docker exec. Тепер, якщо ви хочете видалити контейнер, це можна зробити такою командою:
docker rm ID_or_Name ID_or_Name
Видалення контейнера після його завершення
Щоб контейнер автоматично видалявся після завершення роботи, під час його створення можна використати команду docker run --rm. Так контейнер буде видалено одразу після того, як він завершить роботу.
docker run --rm image_name
Видалення всіх завершених контейнерів
Щоб знайти контейнери, скористайтеся командою docker ps -a, яка показує всі контейнери незалежно від їхнього статусу: created, restarting, running, paused або exited. Щоб відібрати лише завершені контейнери, застосуйте прапорець -f і відфільтруйте за статусом.
docker ps -a -f status=exited
Переконавшись, які контейнери ви хочете видалити, скористайтеся прапорцем -q, щоб отримати їхні ID, і передайте їх команді docker rm для видалення.
docker rm $(docker ps -a -f status=exited -q)
Видалення контейнерів за шаблоном
Знайти контейнери, що відповідають певному шаблону, можна, поєднавши команду docker ps і grep.
docker ps -a | grep "pattern"
Відфільтрувавши контейнери, які ви хочете видалити, скористайтеся awk і xargs, щоб передати їхні ID команді docker rm. Майте на увазі, що ці утиліти не входять до складу Docker і можуть бути доступні не в усіх системах.
docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm
Видалення контейнерів за кількома фільтрами
У Docker можна застосувати кілька фільтрів, указавши прапорець filter кілька разів, щоразу з іншим значенням. Це дає змогу вивести контейнери, що відповідають будь-якій із заданих умов. Наприклад, щоб видалити всі контейнери, які перебувають у стані «created» (це може статися, якщо контейнер запущено з неправильною командою) або завершили роботу, можна використати два окремі фільтри.
docker ps -a -f status=exited -f status=created
Щоб видалити ці контейнери, скористайтеся такою командою:
docker rm $(docker ps -a -f status=exited -f status=created -q)
Зупинення та видалення всіх контейнерів
Щоб переглянути всі контейнери у вашій системі, скористайтеся командою docker ps. Додавши прапорець -a, ви побачите всі контейнери, зокрема зупинені.
docker ps -a
Коли будете готові їх видалити, скористайтеся прапорцем -q, щоб отримати ID контейнерів, і передайте їх командам docker stop і docker rm, щоб зупинити та видалити контейнери.
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
Видалення томів Docker
Щоб знайти імена томів, які ви хочете видалити, скористайтеся командою docker volume ls.
docker volume ls
Визначивши томи, ви можете видалити один або кілька з них за допомогою команди docker volume rm.
docker volume rm volume_name volume_name
Видалення контейнера Docker разом із його томом
Якщо ви створюєте контейнер із безіменним томом, можна видалити і контейнер, і том одночасно за допомогою прапорця -v. Це працює лише для безіменних томів.
docker rm -v container_name
Після видалення контейнера буде виведено його ID, але про видалення тому прямо не згадується. Якщо том безіменний, його буде непомітно видалено із системи. Однак якщо він має ім'я, том залишиться в системі й не буде видалений.
Видалення «завислих» томів Docker
Томи задумано так, щоб вони існували незалежно від контейнерів, тому під час видалення контейнера пов'язаний із ним том автоматично не видаляється. Якщо том більше не під'єднаний до жодного контейнера, він стає «завислим».
Щоб знайти такі томи, скористайтеся командою docker volume ls з фільтром, який показує лише «завислі» томи.
docker volume ls -f dangling=true
Перевіривши список, ви можете видалити їх усі одразу командою docker volume prune.
docker volume prune
Висновок
У цьому гайді наведено деякі ключові команди для видалення образів, контейнерів і томів Docker. Для кожної команди існує ще багато інших параметрів і прапорців для різних сценаріїв використання. Докладний огляд таких команд, як docker system prune, docker rmi, docker rm і docker volume rm, ви знайдете в документації Docker. Якщо ви хочете, щоб ми розглянули якісь типові завдання з очищення, пропонуйте їх у коментарях.
Шукаєте стабільну продуктивність і масштабовані рішення для своїх проєктів? Відкрийте для себе BlueVPS.com.ua: прості, налаштовувані та виділені середовища з необмеженим трафіком і чудовою доступністю хмари. Не зволікайте, ознайомтеся вже зараз і підвищте продуктивність свого VPS сьогодні!
Blog