Docker Видалити зображення: Як видалити зображення Docker, пояснені на прикладах

Ми живемо в епоху, коли зберігання з кожним днем ​​стає дешевшим. Ми можемо просто відправити все в хмару і майже нічого не платити.

То чому б нам турбуватися про видалення зображень Docker?

Перш за все, існують деякі критично важливі навантаження, які неможливо перенести в хмару, особливо в таких жорстко регульованих галузях, як право та охорона здоров’я.

Але щоб краще відповісти на це запитання, я б сказав, що ми як розробники часто опиняємось поза місцем на наших локальних машинах.

Давайте швидко зробимо аналіз цього загальнодоступного набору даних StackOverflow, щоб дослідити це далі:

SELECT tag, title, answer_count, favorite_count, score, view_count VIEWS FROM (SELECT title, answer_count, favorite_count, view_count, score, SPLIT(tags, '|') tags FROM `bigquery-public-data.stackoverflow.posts_questions` posts_questions), UNNEST(tags) tag WHERE tag = 'docker' AND title LIKE '%space left%' ORDER BY VIEWS DESC

Результати запиту:

Тож це трапляється не лише зі мною, так? Подивіться, скільки переглядів у нас на цих публікаціях StackOverflow. Якщо вам цікаво, кількість повідомлень, що відповідають пошуковому запиту, становить 465687 переглядів.

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

Що таке звисаючі та невикористані зображення Docker?

малювання

У чому різниця між звисаючими та невикористаними зображеннями, ви можете запитати?

Висяче зображення означає, що ви створили нову збірку зображення, але не дали йому нової назви. Подумайте про ті старі, забуті образи, з якими вже ніхто не знає, що робити - це «звисаючі образи».

Вони залишаються без позначок і відображаються на їх імені під час запуску docker images.

З іншого боку, невикористане зображення означає, що воно не було призначене або не використовується в контейнері.

Наприклад, під час запуску docker ps -a- у ньому буде перераховано всі запущені на даний момент контейнери та виведені контейнери. Будь-які зображення, що використовуються всередині будь-якого контейнера, відображаються як "використані зображення", а всі інші не використовуються.

Видалити зображення Docker

Тепер давайте розглянемо кілька прикладів того, як видалити зображення Docker.

Наше тематичне дослідження

малювання

Busy Cat Corp - це вигадана компанія, яка збирає дані про поведінку котів та надає рекомендації власникам котів, як зробити своїх вихованців зайнятішими та щасливішими.

Всі їх робочі навантаження містяться в контейнерах, і вони використовують такі зображення бази даних:

Кассандра, Postgres, MySQL та Монго.

Їх розробникам постійно не вистачає місця на своїх машинах, і вони є найкращими користувачами StackOverflow - чи не всі ми?

Тож вони попросили у нас коротких прикладів того, як видалити деякі зображення та повернути їхній простір.

Спочатку давайте подивимось на машину одного з їх розробників.

docker images

Вихідні дані

REPOSITORY TAG IMAGE ID CREATED SIZE   9c872a6119cc About a minute ago 384MB mysql latest 5ac22cccc3ae 43 hours ago 544MB cassandra 3 9fab0c92a93d 4 days ago 384MB adoptopenjdk 8-jre... 2bf0172ac69b 4 days ago 210MB mongo latest 6d11486a97a7 2 weeks ago 388MB postgres latest b97bae343e06 6 weeks ago 313MB

Це круто, вони завантажили всі зображення зі своїх робочих навантажень. Але подивіться на дисковий простір - це більше 2 Гб ! Давайте подивимося, що ми можемо для них зробити.

Видалити звисаючі зображення Docker

Ми почнемо з пошуку звисаючих зображень.

docker images -qf "dangling=true"

Вихідні дані

REPOSITORY TAG IMAGE ID CREATED SIZE   9c872a6119cc About a minute ago 384MB

У нас він є, тож ми збираємось це прояснити.

Видаліть звисаюче зображення

docker rmi $(docker images -qf "dangling=true") 
малювання

Видалити невикористані зображення Docker

Далі ми шукаємо невикористані зображення.

docker ps -a

Вихідні дані

CONTAINER ID IMAGE CREATED NAMES b6387b343b81 mysql 16 minutes ago some-mysql

У нас є лише один контейнер, на якому запущено   mysql  зображення, тому всі інші зображення не використовуються.

Щоб нам не потрібно було робити це вручну, ми можемо скласти сценарій, який показує всі невикористані зображення, щоб перевірити їх.

# Get all the images currently in use USED_IMAGES=($( \ docker ps -a --format '{{.Image}}' | \ sort -u | \ uniq | \ awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \ )) # Get all the images currently available ALL_IMAGES=($( \ docker images --format '{{.Repository}}:{{.Tag}}' | \ sort -u \ )) # Print the unused images for i in "${ALL_IMAGES[@]}"; do UNUSED=true for j in "${USED_IMAGES[@]}"; do if [[ "$i" == "$j" ]]; then UNUSED=false fi done if [[ "$UNUSED" == true ]]; then echo "$i is not being used." fi done

Вихідні дані

adoptopenjdk:8-jre-hotspot-bionic is not being used. cassandra:3 is not being used. mongo:latest is not being used. postgres:latest is not being used.

Потім він видаляє невикористані зображення.

# Get all the images currently in use USED_IMAGES=($( \ docker ps -a --format '{{.Image}}' | \ sort -u | \ uniq | \ awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \ )) # Get all the images currently available ALL_IMAGES=($( \ docker images --format '{{.Repository}}:{{.Tag}}' | \ sort -u \ )) # Remove the unused images for i in "${ALL_IMAGES[@]}"; do UNUSED=true for j in "${USED_IMAGES[@]}"; do if [[ "$i" == "$j" ]]; then UNUSED=false fi done if [[ "$UNUSED" == true ]]; then docker rmi "$i" fi done

Після видалення як звисаючих, так і невикористаних зображень ми можемо подивитися на те, що нам залишилось.

docker images

Вихідні дані

REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 5ac22cccc3ae 43 hours ago 544MB

Отже, у нас залишається лише mysql  зображення, це чудово!

малювання

Видаліть усі застарілі зображення Docker за допомогою чорносливу

Ці команди звучать чудово, але другий розробник сказав, що їх не хвилює різниця між звисаючими та невикористаними зображеннями.

Все, що вони хотіли, - це очистити застарілі зображення та повернути їм місце на диску.

Особисто я цим зазвичай займаюся.

Тож ми можемо просто використовувати команди обрізання Докера.

# First delete all stopped containers docker container prune # Then delete both dangling and unused images docker image prune --all

Це призведе до видалення як невикористаних, так і звисаючих зображень. Або іншими словами зображення без принаймні одного контейнера, пов'язаного з ними.

Примітка: саме тому нам потрібно було спочатку видалити зупинені контейнери в коді вище.

обгортання вгору

In this article we saw how to delete Docker Images, and we used a fictional company to explain it with some easy-to-use examples.

It's important to point out that you shouldn't use Docker to keep a history of your old images. For a developer environment that's fine, and you can even automate the image clean up workload if you have to deal with a lot of them.

But for a production workload, you should be using a Container Registry solution to handle your Docker images.

There are many Container Registry solutions out there, like Google Cloud Platform with Artifact Registry and Docker Enterprise with Docker Trusted Registry. And if you are in the open source world, you can just use Docker Hub :).

Thanks for reading!

* Illustrations by Icons 8 from Icons8

Якщо ви вважаєте це корисним або хочете кинути виклик або продовжити щось, що було піднято тут, не соромтеся зв’язуватися зі мною у Twitter або Linkedin. Давайте підключатись!