Подтвердить что ты не робот

Как очистить мою докерную машину

Как я создаю/отлаживаю докеры image/container docker, похоже, оставляет в моей системе всевозможные артефакты. (в какой-то момент было ограничение на 48 изображений). Но в последний раз, когда я смотрел, было 20-25 изображений; docker images.

Таким образом, основные вопросы:

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

и мета-вопрос... какие вопросы я не спросил, что нужно?

4b9b3361

Ответ 1

Также может быть полезно удалить "оборванные" изображения

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

Ответ 2

Вот как я периодически очищаю свой хост докера:

Убейте запущенные контейнеры:

docker kill $(docker ps -qa)

Удалить все контейнеры (и связанные с ними тома):

docker rm -v $(docker ps -qa)

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

docker rmi $(docker images -q)

Update

Удалите только те контейнеры, которые не запущены. Разберите вывод "ps" для строки "Exited":

docker ps -a | awk '/Exited/ {print $1}' | xargs docker rm -v

Не идеально... Не давайте вашему контейнеру имя "Exited": -)

Update

Docker 1.9 имеет новую команду тома, которая может использоваться для очистки старых томов

docker volume rm $(docker volume ls -qf dangling=true)

Update

В последней версии сообщества docker появилась новая команда "обрезка системы"

docker system prune --volumes

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

Ответ 3

Я также хотел бы внести свой вклад в это с помощью некоторых команд, которые были добавлены в версию 1.13.0:

$ docker system prune
$ docker container prune
$ docker image prune
$ docker volume prune
$ docker network prune

см. журнал изменений: 1.13.0 (2017-01-18)

Добавьте новую команду docker system с подкомандами df и prune для управления системными ресурсами, а также подкоманды docker {container,image,volume,network} prune # 26108 # 27525/# 27525

Ответ 4

Update: В докере cli есть встроенные фильтры, которые позволяют отображать контейнеры, соответствующие определенным критериям. Эти функции bash берутся из одного из основных поддерживающих операторов dotfiles:

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}
del_stopped(){
    local name=$1
    local state=$(docker inspect --format "{{.State.Running}}" $name 2>/dev/null)

    if [[ "$state" == "false" ]]; then
        docker rm $name
    fi
}

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

Помощник script Я создал для собственного использования:

#!/bin/bash

# options:
# remove stopped containers and untagged images
#     $ dkcleanup
# remove all stopped|running containers and untagged images
#     $ dkcleanup --reset
# remove containers|images|tags matching {repository|image|repository\image|tag|image:tag}
# pattern and untagged images
#     $ dkcleanup --purge {image}
# everything
#     $ dkcleanup --nuclear

if [ "$1" == "--reset" ]; then
    # Remove all containers regardless of state
    docker rm -f $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove."
elif [ "$1" == "--purge" ]; then
    # Attempt to remove running containers that are using the images we're trying to purge first.
    (docker rm -f $(docker ps -a | grep "$2/\|/$2 \| $2 \|:$2\|$2-\|$2:\|$2_" | awk '{print $1}') 2>/dev/null || echo "No containers using the \"$2\" image, continuing purge.") &&\
    # Remove all images matching arg given after "--purge"
    docker rmi $(docker images | grep "$2/\|/$2 \| $2 \|$2 \|$2-\|$2_" | awk '{print $3}') 2>/dev/null || echo "No images matching \"$2\" to purge."
else
    # This alternate only removes "stopped" containers
    docker rm -f $(docker ps -a | grep "Exited" | awk '{print $1}') 2>/dev/null || echo "No stopped containers to remove."
fi

if [ "$1" == "--nuclear" ]; then
    docker rm -f $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove."
    docker rmi $(docker images -q) 2>/dev/null || echo "No more images to remove."
else
    # Always remove untagged images
    docker rmi $(docker images | grep "<none>" | awk '{print $3}') 2>/dev/null || echo "No untagged images to delete."
fi

exit 0

источник

На ваши вопросы:

как правильно очистить?

нет официального пути, просто вспомогательные скрипты и функции, подобные приведенным выше.

поскольку я вручную удалял изображения, которые больше начали поступать. а?

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

сколько места на диске я должен выделить хосту?

зависит от типов изображений, которые вы планируете использовать. Знайте, что многократное использование 500-мегабайтного изображения не используется (пространство размером 500 Мб X). Контейнеры повторно используют одно и то же изображение и просто добавляют все, что они меняют при работе сверху. Поэтому подумайте о перспективе хранения изображений, а не о времени выполнения контейнера в отношении хранилища.

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

По умолчанию они останавливаются при перезагрузке хоста. Вам нужно запустить с помощью docker run --restart=True для автоматического запуска при перезагрузке хоста.

Ответ 5

Я использую докер-машину с VirtualBox, и после удаления всех контейнеров и всех изображений изображение докеры VirtualBox по-прежнему потребляет много гигабайт дискового пространства.

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

docker-machine rm default
docker-machine create --driver virtualbox default

Ответ 6

Иногда у вас не будет статуса, он просто будет пустым.

вот моя версия:

docker rm -f $(docker ps -a | env -i grep -v Up | tail -n+2 | cut -d ' ' -f 1)