Команда docker compose down
docker compose downИспользуется для остановки и удаления всех контейнеров, сетей и связанных ресурсов, запущенных с помощьюdocker compose up.
При выполненииdocker compose upпосле запуска набора сервисов Docker автоматически создаёт контейнеры, сети и даже анонимные тома данных.
Если использовать толькоdocker compose stop, контейнеры лишь приостанавливаются, но всё ещё занимают дисковое пространство и сохраняют конфигурацию сети; при следующем запуске старое состояние может вызвать конфликты.
docker compose downЗатем следует полная очистка в один клик: остановка контейнеров, удаление контейнеров, удаление сетей и восстановление среды до чистого состояния.
Следующая блок-схема показывает полную цепочку выполнения команды down:
Если вы не уверены, чистая ли текущая среда, сначала используйтеdocker compose psПроверьте запущенные контейнеры, затем решите, стоит ли запускать down.
Быстрый старт
Простейшее использование: в каталоге, содержащемdocker-compose.ymlвыполните в каталоге, где находится файл:
# 进入 Compose 项目目录 cd ~/myproject # 一键停止并清理所有资源 docker compose down
После выполнения терминал обычно выводит что-то вроде следующего:
[+] Running 3/3 Container myproject-web-1 Removed 1.2s Container myproject-db-1 Removed 0.8s Network myproject_default Removed 0.3s
На этом этапе:
- Все контейнеры, запущенные Compose, были остановлены и удалены.
- Специфичная для проекта сеть была удалена.
- Тома данныхСохраняются по умолчанию(чтобы предотвратить случайное удаление данных)
Краткий справочник по опциям команды
Ниже представленdocker compose downполный список поддерживаемых опций:
| Параметры | Сокращение | Описание | Значение по умолчанию |
|---|---|---|---|
| --volumes | -v | Удалить именованные тома данных, определённые в файле Compose, а также анонимные тома данных, монтируемые контейнерами. | Не удалять |
| --remove-orphans | Отсутствует | Удалить осиротевшие контейнеры, соответствующие сервисам, которых больше нет в файле Compose. | Не удалять |
| --rmi <type> | Отсутствует | Удалить образы, используемые сервисами; тип необязателен.all(Все) илиlocal(только собранные локально) | Не удалять |
| --timeout | -t | Тайм-аут (в секундах) для остановки контейнеров; по истечении тайм-аута принудительно завершить. | 10 |
| --dry-run | Отсутствует | Только выводить операции, которые будут выполнены, без их фактического выполнения (v2.21+). | Не включать |
Особенности поведения по умолчанию, требующие наибольшего внимания:Тома данных не удаляются по умолчаниюЭто означает, что даже если вы выполните down, данные в базе данных останутся в томе данных и будут восстановлены при следующем запуске up. Это механизм защиты, но если вы действительно хотите полностью очистить всё, не забудьте добавить-v。
Подробное использование
Базовое использование: остановка и очистка
Запустите прямо в каталоге проекта без каких-либо параметров:
# 停止并删除容器和网络,保留数据卷 docker compose down
Это эквивалентно последовательному выполнению:
docker compose stop # 停止所有容器 docker compose rm -f # 强制删除所有容器 docker network rm <网络名> # 删除项目网络
Также удалите тома данных: -v / --volumes
Когда нужно полностью очистить окружение — включая постоянные данные, такие как данные базы данных и кэши — добавьте-v:
# 删除容器、网络以及 Compose 文件中定义的所有具名数据卷 docker compose down -v
Ниже приведён полный пример сравнения, помогающий понять-vВлияние:
Пример
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example123
volumes:
- db_data:/var/lib/mysql # именованные тома
volumes:
db_data: # определить именованные тома
# 不带 -v:db_data 数据卷保留,数据库中的数据不丢失 $ docker compose down [+] Running 3/3 Container test-web-1 Removed Container test-db-1 Removed Network test_default Removed # 带 -v:db_data 数据卷被删除,数据库数据永久丢失 $ docker compose down -v [+] Running 4/4 Container test-web-1 Removed Container test-db-1 Removed Volume test_db_data Removed Network test_default Removed
Выполнение в производственной средеdown -vПрежде чем [делать это], хорошенько подумайте — после удаления тома данных данные невозможно восстановить. Рекомендуется сначала создать резервную копию данных или использовать это только в непроизводственных средах.-v。
Очистка осиротевших контейнеров: --remove-orphans
Когда вы удаляете определение сервиса из файла docker-compose.yml, но контейнер этого сервиса всё ещё остаётся, такие контейнеры называются "осиротевшими контейнерами".
Пример
services:
app:
image: nginx
networks:
- shared_network # ссылка на внешнюю сеть
networks:
shared_network:
external: true # внешняя сеть, down не удалит её
volumes:
shared_data:
external: true # внешний том, down -v тоже его не удалит
Это разумно: внешние ресурсы могут совместно использоваться несколькими проектами Compose и не должны очищаться одним проектом.
Порядок запуска зависимостей контейнеров
down останавливает контейнеры в обратном порядке, то есть сначала останавливает зависимую сторону, затем сторону, от которой она зависит, противоположно порядку запуска при up, что обеспечивает корректное освобождение зависимостей.
Совместимость с docker-compose (устаревшая версия)
Если вы используете старую версиюdocker-compose(с дефисом), формат команды:
$ docker-compose down -v
Новый Docker Compose v2 интегрирует функциональность Compose в Docker CLI, и команда становитсяdocker compose(разделённая пробелом.) Параметры у обоих абсолютно одинаковы, но рекомендуется последовательно использовать новый формат.
ЧАВО
В: После выполнения down контейнеры всё ещё работают?
Возможная причина: эти контейнеры не были созданы текущим файлом Compose, а были запущены черезdocker runили запущены другими файлами Compose.
используйтеdocker psдля просмотра сведений о контейнере, чтобы убедиться, совпадает ли префикс имени контейнера с именем проекта Compose.
В: Дисковое пространство не освобождается после down -v?
Проверьте, не занимают ли неиспользуемые образы место:
$ docker image ls # 查看镜像列表 $ docker image prune -a # 清理未使用的镜像
Docker не очищает образы автоматически; нужно вручную выполнитьdocker image pruneили использоватьdown --rmi allОчистить всё вместе.
Вопрос: Как безопасно выполнить down в скрипте?
Пример
# Скрипт безопасной очистки: сначала убедитесь, что проект запущен, затем выполните down
PROJECT_DIR="/opt/example-app"
if [ -f "$PROJECT_DIR/docker-compose.yml" ]; then
cd "$PROJECT_DIR"
# Сначала используйте ps, чтобы проверить, есть ли запущенные сервисы
if docker compose ps --status running | grep -q .; затем
echo "Останавливаем проект EXAMPLE..."
docker compose down --remove-orphans
echo "Очистка завершена"
else
echo "Проект не запущен, пропускаем операцию down"
fi
else
echo "Ошибка: не удается найти файл docker-compose.yml"
exit 1
fi
Этот скрипт выполняет базовые проверки путей и оценку состояния перед очисткой, чтобы избежать случайных операций.
Другие расширения