docker - удалить - как узнать версию докера




Как удалить старые контейнеры Docker (20)

Основные шаги по остановке / удалению всех контейнеров и изображений

  1. Перечислите все контейнеры

    docker ps -aq

  2. Остановить все запущенные контейнеры

    docker stop $(docker ps -aq)

  3. Удалить все контейнеры

    docker rm $(docker ps -aq)

  4. Удалить все изображения

    docker rmi $(docker images -q)

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

Этот вопрос связан с тем, должен ли я беспокоиться о избыточных, неработающих, контейнерах Docker? ,

Мне интересно, как удалить старые контейнеры. docker rm 3e552code34a позволяет удалить один, но у меня уже есть много. docker rm --help не дает выбор (например, все или по имени изображения).

Возможно, есть каталог, в котором хранятся эти контейнеры, где я могу их легко удалить вручную?


Удалите все контейнеры, созданные с определенного изображения:

docker rm  $(docker ps -a | awk '/myimage:mytag/{print $1}')

В Docker 1.13.x есть новая функция, называемая Docker container prune : docker container prune

Это будет делать то, что вы хотите, и должно работать на всех платформах одинаково.

Существует также система Docker prune : docker system prune , которые очищают контейнеры, изображения, тома и сети в одной команде.

Оригинальный ответ:

Были некоторые разговоры о команде очистки Docker. Вы можете найти информацию об этом билете: выполнить команду «clean» (# 928)

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

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Чтобы дать кредит, где это происходит, этот пример представлен на https://twitter.com/jpetazzo/status/347431091415703552 .


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

Удалить запущенные контейнеры

docker rm $(docker stop -t=1 $(docker ps -q))

Вместо stop вы можете использовать kill . В моем случае я предпочитаю stop потому что я стараюсь повторять их против создания нового каждый раз, поэтому я стараюсь их закрыть.

Примечание. При попытке остановить контейнер вы получите сообщение об ошибке:

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

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

docker rm $(docker ps -a -q)


Вы можете удалить только остановленные контейнеры. Остановить все в начале

docker stop $(docker ps -a -q)

Затем вы можете удалить

docker rm $(docker ps -a -q)


Другой метод, который я получил от Гийома Дж. Чармеса (кредит, когда он должен):

docker rm `docker ps --no-trunc -aq`

удалит все контейнеры элегантным способом.

И Bartosz Bilicki, для Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Для PowerShell:

docker rm @(docker ps -aq)

Обновление с Docker 1.13 (Q4 2016), кредит для VonC ( позже в этом потоке ):

docker system prune удалит ВСЕ неиспользуемые данные (т. е. в порядке: контейнеры остановлены, тома без контейнеров и изображений без контейнеров).

См. PR 26108 и commit 86de7c0 , в которых представлены несколько новых команд, которые помогают облегчить визуализацию того, сколько места данные демона Docker берут на диск и позволяя легко очищать «ненужный» избыток.

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Если вам не нравится удалять все контейнеры, вы можете выбрать все контейнеры, созданные до или после определенного контейнера с docker ps --before <container-ID> или с помощью docker ps --since <container-ID> . Эта функция, по крайней мере, в версии Docker 0.6.5.

Допустим, вы разработали свою систему, и теперь она работает, но осталось несколько контейнеров. Вы хотите удалить контейнеры, созданные до этой рабочей версии. Определите идентификатор рабочего контейнера с docker ps .

Удалить контейнеры, созданные перед другим контейнером

docker rm $(docker ps --before 9c49c11c8d21 -q)

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

Удалить контейнеры, созданные после определенного контейнера

docker rm $(docker ps --since a6ca4661ec7f -q)

Docker хранит контейнеры в /var/lib/docker/containers в Ubuntu. Я думаю, что дополнительные контейнеры не наносят никакого вреда, но занимают дисковое пространство.


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

docker system prune -f

Поэтому лично я рекомендую сделать это как часть вашего сценария развертывания для изображений и контейнеров, сохраняя только последние n контейнеров и изображений. Я помещаю свои изображения Docker той же схемой версий, которую я использую с git tag а также всегда помечать последнее изображение Docker с помощью «последнего». Это означает, что, не очищая ничего, мои изображения Docker выглядят так:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

Теперь, конечно, я не хочу, чтобы все мои изображения (или контейнеры) возвращались на вечность во всех моих производственных коробках. Я просто хочу последние 3 или 4 для откатов и избавиться от всего остального. tail Unix - ваш лучший друг здесь. Поскольку docker images и docker ps порядку по дате, мы можем просто использовать tail чтобы выбрать все, кроме трех лучших, и удалить их:

docker rmi $(docker images -q | tail -n +4)

Запустите это вместе с вашими сценариями развертывания (или локально), чтобы всегда иметь достаточно изображений, чтобы удобно откидываться назад, не занимая слишком много места или загромождая вещи старыми изображениями.

Лично я оставляю в контейнере только один контейнер в любое время, но вы можете делать то же самое с контейнерами, если хотите:

docker rm $(docker ps -aq | tail -n +4)

Наконец, в моем упрощенном примере мы имеем дело только с одним репозиторием за раз, но если бы у вас было больше, вы можете просто немного усложниться с той же идеей. Скажем, я просто хочу сохранить последние три изображения из some_repo / some_image. Я могу просто смешать в grep и awk и быть в пути:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

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


Теперь можно использовать filtering с docker ps :

docker rm $(docker ps -q -f status=exited)

И для images :

docker rmi $(docker images -q -f "dangling=true")

Тем не менее, любой из них заставит docker rm или docker rmi выбросить ошибку, если нет соответствующих контейнеров. Более старый docker rm $(docker ps -aq) трюк был еще хуже, поскольку он пытался удалить любой запущенный контейнер, не docker rm $(docker ps -aq) на каждом из них.

Вот простой сценарий для добавления в ~/.bashrc или ~/.profile :

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

Изменить: Как указано ниже, первоначальный ответ заключался в удалении изображений, а не в контейнерах. Обновлено, чтобы ответить на оба вопроса, включая новые ссылки на документацию. Спасибо Адриану (и ответ Райана) за упоминание новой ps фильтрации.


Удаление всех контейнеров из оболочки Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

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

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

Из комментария pauk960 :

Начиная с версии 1.3.0 вы можете использовать фильтры с docker ps , а не grep Exited use docker ps -a -f status=exited . И если вы используете -q с ним, вы можете получить идентификаторы контейнера, а не полный вывод, не нужно использовать awk для этого.


Чтобы удалить ВСЕ контейнеры без плача:

sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f

https://github.com/HardySimpson/docker-cleanup

Очистка докеров

Крошечная оболочка «все-в-одном», которая удаляет:

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

Предназначен для работы в качестве работы crontab

Особенность

  • Он удалит все <none>:<none> изображения
  • Если изображение имеет несколько ссылок на репо: теги к нему, оно удалит все теги repo:, за исключением запуска контейнера. На самом деле это характер «докера rmi».
  • Многие сообщения об ошибках будут отображаться на экране, и вы можете выбрать 2>/dev/null или не
  • Изучите что-нибудь из docker-gc и исправьте его проблему (он не может удалить изображение с mutliple repo: tag)

Официальный способ :

docker rm `docker ps -aq`

Сторонники Docker указали, что для этого не будет никакой команды, и вы создадите такие команды:

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


ОБНОВЛЕНО 2017 (НОВЫЙ)

docker container prune

Это - 2017 (OLD) путь

Чтобы удалить ВСЕ ОСТАНОВЛЕННЫЕ КОНТЕЙНЕРЫ

docker rm $(docker ps -a -q)

Чтобы удалить ВСЕ КОНТЕЙНЕРЫ (ОСТАНОВЛЕННЫЕ И НЕ ОСТАНОВЛЕННЫЕ)

docker rm  -f $(docker ps -a -q)

Обновлен ответ Использовать docker system prune или docker container prune . См . Обновленный ответ VonC .

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

docker rm $(docker ps -q -f status=exited)

  • -q выводит только идентификаторы контейнера (без заголовков столбцов)
  • -f позволяет отфильтровать список печатных контейнеров (в этом случае мы фильтруем только отображаемые контейнеры)

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

sudo docker rm $ (sudo docker ps -a -q)

Это приведет к удалению всех остановленных контейнеров путем получения списка всех контейнеров с докере ps -a -q и передачи их идентификаторов в docker rm. Это не должно удалять запущенные контейнеры, и он скажет вам, что он не может удалить запущенное изображение.

Удалить все непомеченные изображения

Теперь вы хотите очистить старые изображения, чтобы сэкономить место.

sudo docker rmi $ (sudo docker images -q --filter "dangling = true")


#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done




docker