Введение
Команда docker-compose down – важный инструмент в управлении контейнерами Docker. Эта лабораторная работа проведет вас через эффективное использование docker-compose down для корректного завершения работы и очистки контейнеров, сетей, томов и образов Docker. Освоив эту команду, вы сможете поддерживать чистую среду Docker и оптимизировать свой рабочий процесс разработки.
Установка Docker Compose и создание демонстрационного проекта
Прежде чем мы сможем использовать команду docker-compose down, необходимо убедиться, что Docker Compose правильно установлен, и создать демонстрационный проект Docker Compose для работы.
Проверка установки Docker Compose
Сначала давайте проверим, была ли успешно установлена Docker Compose во время настройки:
docker-compose version
Вы должны увидеть вывод, аналогичный этому:
Docker Compose version v2.18.1
Создание простого файла Docker Compose
Теперь давайте создадим простой файл Docker Compose, который мы будем использовать в этой лабораторной работе. Мы создадим файл с именем docker-compose.yml в текущем каталоге с базовой веб-службой на основе Nginx.
Используйте редактор nano для создания файла:
cd ~/project/docker-compose-demo
nano docker-compose.yml
Скопируйте и вставьте следующее содержимое в редактор:
version: "3"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- web_data:/usr/share/nginx/html
db:
image: redis:latest
volumes:
- db_data:/data
volumes:
web_data:
db_data:
Сохраните файл, нажав Ctrl+O, затем Enter, и выйдите с помощью Ctrl+X.
Этот файл Docker Compose определяет:
- Веб-службу, использующую образ Nginx
- Службу базы данных, использующую Redis
- Два именованных тома для постоянного хранения данных
Запуск служб Docker Compose
Давайте запустим службы, определенные в нашем файле Docker Compose:
docker-compose up -d
Флаг -d запускает контейнеры в detached mode (в фоновом режиме). Вы должны увидеть вывод, аналогичный:
Creating network "docker-compose-demo_default" with the default driver
Creating volume "docker-compose-demo_web_data" with default driver
Creating volume "docker-compose-demo_db_data" with default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1 ... done
Проверка работающих контейнеров
Давайте проверим, что наши контейнеры работают:
docker-compose ps
Вы должны увидеть вывод, показывающий, что обе службы запущены и работают:
Name Command State Ports
-----------------------------------------------------------------------------------
docker-compose-demo_db_1 docker-entrypoint.sh redis ... Up 6379/tcp
docker-compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8080->80/tcp
Вы также можете проверить доступность веб-сервера Nginx с помощью curl:
curl http://localhost:8080
Вы должны увидеть HTML-вывод страницы приветствия Nginx по умолчанию.
Теперь, когда наши службы запущены и работают, мы готовы узнать о команде docker-compose down на следующем шаге.
Понимание и использование Docker Compose Down
Теперь, когда наши службы Docker Compose запущены, давайте узнаем о команде docker-compose down и о том, как эффективно ее использовать.
Что такое Docker Compose Down?
Команда docker-compose down используется для остановки и удаления контейнеров, сетей, томов и образов, созданных с помощью docker-compose up. Эта команда необходима для очистки ресурсов, когда они больше не нужны, или когда вы хотите сбросить свою среду.
Основное использование Docker Compose Down
Самая простая форма команды:
docker-compose down
Давайте запустим эту команду и посмотрим, что произойдет:
cd ~/project/docker-compose-demo
docker-compose down
Вы должны увидеть вывод, аналогичный:
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
Обратите внимание, что команда:
- Останавливает все работающие контейнеры, определенные в вашем файле Docker Compose
- Удаляет все контейнеры
- Удаляет сеть, созданную Docker Compose
Однако по умолчанию она не удаляет тома. Это важный момент для понимания: тома сохраняются за пределами жизненного цикла контейнеров для сохранения ваших данных.
Проверка удаления ресурсов
Давайте убедимся, что контейнеры и сеть были удалены:
docker-compose ps
Вы должны увидеть пустой список, указывающий на отсутствие работающих контейнеров из этого проекта Docker Compose.
Давайте проверим, существуют ли еще тома:
docker volume ls | grep docker-compose-demo
Вы должны увидеть, что тома все еще существуют:
local docker-compose-demo_db_data
local docker-compose-demo_web_data
Это поведение по умолчанию важно, потому что оно сохраняет ваши данные при перезапуске контейнеров. Если вы хотите удалить и эти тома, вам потребуется использовать дополнительные параметры, которые мы рассмотрим на следующем шаге.
Повторный запуск служб
Давайте снова запустим наши службы, так как они нам понадобятся для следующего шага:
docker-compose up -d
Вы должны увидеть:
Creating network "docker-compose-demo_default" with the default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1 ... done
Обратите внимание, что Docker Compose не потребовалось пересоздавать тома, так как они уже существуют.
Теперь вы понимаете основное использование docker-compose down. На следующем шаге мы рассмотрим более продвинутые параметры для управления тем, какие именно ресурсы будут удалены.
Использование Docker Compose Down с расширенными параметрами
Базовая команда docker-compose down полезна, но Docker Compose предоставляет дополнительные параметры, чтобы дать вам больше контроля над тем, какие ресурсы удаляются. На этом шаге мы рассмотрим эти параметры.
Удаление томов
Как мы наблюдали на предыдущем шаге, docker-compose down по умолчанию не удаляет тома. Это функция безопасности для предотвращения случайной потери данных. Однако бывают случаи, когда вы хотите удалить и тома, например, при полной очистке или когда вы хотите сбросить данные вашего приложения.
Чтобы удалить тома вместе с контейнерами и сетями, используйте флаг --volumes:
docker-compose down --volumes
Давайте попробуем:
cd ~/project/docker-compose-demo
docker-compose down --volumes
Вы должны увидеть вывод, аналогичный:
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
Removing volume docker-compose-demo_web_data
Removing volume docker-compose-demo_db_data
Обратите внимание, что на этот раз тома также удаляются.
Давайте проверим, были ли удалены тома:
docker volume ls | grep docker-compose-demo
Вы не должны увидеть никакого вывода, подтверждающего, что тома были удалены.
Удаление образов
Еще один полезный параметр — удаление образов при выключении вашей среды Docker Compose. Это можно сделать с помощью флага --rmi, который принимает разные значения:
--rmi all: Удалить все образы, используемые любой службой--rmi local: Удалить только образы, у которых нет пользовательского тега
Давайте снова запустим наши службы, а затем используем флаг --rmi:
docker-compose up -d
Дождитесь запуска служб, затем выключите их с помощью флага --rmi:
docker-compose down --rmi local
Вы должны увидеть вывод, аналогичный:
Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1 ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1 ... done
Removing network docker-compose-demo_default
Removing image redis:latest
Removing image nginx:latest
На этот раз образы также удаляются.
Удаление контейнеров-сирот
Иногда у вас могут быть контейнеры, которые были созданы Docker Compose, но больше не определены в вашем текущем файле docker-compose.yml. Они называются "контейнерами-сиротами".
Чтобы продемонстрировать это, давайте изменим наш файл Docker Compose, чтобы удалить службу db:
nano docker-compose.yml
Отредактируйте файл, чтобы удалить службу db и ее том:
version: "3"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- web_data:/usr/share/nginx/html
volumes:
web_data:
Сохраните и выйдите из редактора (Ctrl+O, Enter, Ctrl+X).
Теперь давайте снова запустим наши службы с обновленным файлом:
docker-compose up -d
Если у нас был предыдущий контейнер, работающий для службы db, который не был правильно остановлен, он теперь будет считаться сиротой. Мы можем удалить таких сирот, используя флаг --remove-orphans:
docker-compose down --remove-orphans
Это гарантирует, что любые контейнеры, которые были созданы предыдущей версией вашего файла Docker Compose, но больше не определены, также будут удалены.
Комбинирование параметров
Вы также можете комбинировать эти параметры для полной очистки:
docker-compose down --volumes --rmi all --remove-orphans
Эта команда:
- Остановит и удалит все контейнеры
- Удалит все именованные тома
- Удалит все образы, используемые любой службой
- Удалит любые контейнеры-сироты
Это особенно полезно, когда вы хотите полностью сбросить свою среду или когда вы готовитесь внести значительные изменения в конфигурацию Docker Compose.
Изучение дополнительных параметров
Вы можете увидеть все доступные параметры для команды docker-compose down, используя флаг help:
docker-compose down --help
Уделите немного времени, чтобы просмотреть доступные параметры и их описания.
Теперь у вас есть хорошее понимание того, как использовать docker-compose down с различными параметрами для управления тем, какие ресурсы удаляются при выключении вашей среды Docker Compose.
Лучшие практики и реальные сценарии
Теперь, когда вы понимаете команду docker-compose down и ее параметры, давайте рассмотрим некоторые лучшие практики и реальные сценарии эффективного использования этой команды.
Создание более сложной среды Docker Compose
Чтобы лучше продемонстрировать использование в реальных условиях, давайте создадим более сложную среду Docker Compose. Мы настроим простое веб-приложение с интерфейсом, бэкендом и базой данных.
cd ~/project/docker-compose-demo
nano docker-compose.yml
Замените содержимое на:
version: "3"
services:
frontend:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- frontend_data:/usr/share/nginx/html
networks:
- app_network
backend:
image: node:14-alpine
command: sh -c "echo 'Backend service running' && sleep infinity"
volumes:
- backend_data:/app
networks:
- app_network
- db_network
database:
image: postgres:13-alpine
environment:
POSTGRES_PASSWORD: example
POSTGRES_USER: user
POSTGRES_DB: appdb
volumes:
- db_data:/var/lib/postgresql/data
networks:
- db_network
networks:
app_network:
db_network:
volumes:
frontend_data:
backend_data:
db_data:
Сохраните и выйдите из редактора.
Давайте запустим эту более сложную среду:
docker-compose up -d
Вы должны увидеть вывод, показывающий создание сетей, томов и контейнеров для всех трех служб.
Лучшая практика: использование сред
В реальных сценариях у вас могут быть разные среды, такие как разработка, тестирование и производство. Docker Compose позволяет использовать разные файлы конфигурации для разных сред.
Создайте файл для среды разработки:
nano docker-compose.dev.yml
Добавьте следующее содержимое:
version: "3"
services:
frontend:
ports:
- "8081:80"
environment:
NODE_ENV: development
backend:
environment:
NODE_ENV: development
DEBUG: "true"
database:
ports:
- "5432:5432"
Сохраните и выйдите из редактора.
Чтобы использовать этот файл в сочетании с базовым файлом, вы можете использовать флаг -f:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
Это объединит конфигурации, применив настройки, специфичные для разработки.
Чтобы выключить эту среду, вы будете использовать:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml down
Лучшая практика: использование скрипта очистки
В конвейерах непрерывной интеграции/развертывания (CI/CD) или рабочих процессах разработки часто полезно иметь скрипт очистки, который удаляет все ресурсы Docker. Давайте создадим простой скрипт очистки:
nano cleanup.sh
Добавьте следующее содержимое:
#!/bin/bash
echo "Cleaning up Docker environment..."
## Stop and remove containers, networks, volumes, and images
docker-compose down --volumes --rmi all --remove-orphans
## Remove dangling volumes
echo "Removing dangling volumes..."
docker volume prune -f
## Remove dangling images
echo "Removing dangling images..."
docker image prune -f
echo "Cleanup complete!"
Сохраните и выйдите из редактора.
Сделайте скрипт исполняемым:
chmod +x cleanup.sh
Теперь вы можете запускать этот скрипт всякий раз, когда вам нужно выполнить полную очистку:
./cleanup.sh
Лучшая практика: выборочное удаление ресурсов
Иногда вам может потребоваться удалить только определенные ресурсы. Например, вы можете захотеть сохранить свои тома (для сохранения данных), но удалить контейнеры, сети и образы.
Вот как вы будете подходить к различным сценариям:
Удалить только контейнеры и сети (сохранить тома и образы):
docker-compose downУдалить контейнеры, сети и образы (сохранить тома):
docker-compose down --rmi allУдалить контейнеры, сети и тома (сохранить образы):
docker-compose down --volumesУдалить только локальные образы (не извлеченные из реестра):
docker-compose down --rmi local
Выборочно удаляя ресурсы, вы можете оптимизировать свой рабочий процесс в соответствии с вашими конкретными потребностями.
Лучшая практика: мониторинг использования ресурсов
До и после запуска docker-compose down часто полезно отслеживать использование ресурсов Docker. Это может помочь вам выявить любые ресурсы, которые не очищаются должным образом.
Вот несколько полезных команд:
Вывести список всех контейнеров (включая остановленные):
docker ps -aВывести список всех сетей:
docker network lsВывести список всех томов:
docker volume lsВывести список всех образов:
docker image lsПолучить общесистемную информацию:
docker system df
Давайте попробуем последнюю команду, чтобы увидеть текущее использование ресурсов:
docker system df
Вы увидите сводку об использовании ресурсов Docker, включая количество контейнеров, образов, томов и общее используемое пространство.
Выключение нашей сложной среды
Теперь давайте выключим нашу сложную среду и удалим все связанные ресурсы:
docker-compose down --volumes --rmi all --remove-orphans
Это остановит и удалит все контейнеры, сети, тома и образы, связанные с нашим проектом Docker Compose.
Следуя этим лучшим практикам, вы можете эффективно управлять своими средами Docker и обеспечивать оптимальное использование ресурсов.
Резюме
В этой лабораторной работе вы узнали, как эффективно использовать команду docker-compose down для управления вашими контейнерами и ресурсами Docker. Вот краткий обзор того, что вы сделали:
- Установили Docker Compose и создали простую среду Docker Compose
- Изучили основы
docker-compose downи то, как она удаляет контейнеры и сети по умолчанию - Рассмотрели расширенные параметры, такие как
--volumes,--rmiи--remove-orphans, чтобы точно контролировать, какие ресурсы удаляются - Реализовали лучшие практики использования Docker Compose в реальных сценариях, включая:
- Использование файлов конфигурации, специфичных для среды
- Создание скриптов очистки
- Выборочное удаление ресурсов
- Мониторинг использования ресурсов
Освоив команду docker-compose down, вы теперь обладаете знаниями для поддержания чистой среды Docker, предотвращения утечек ресурсов и оптимизации рабочего процесса разработки.
Запомните эти ключевые моменты:
- Базовая команда
docker-compose downудаляет контейнеры и сети, но сохраняет тома - Используйте
--volumes, чтобы удалить тома, когда вы хотите сбросить свои данные - Используйте
--rmi, чтобы удалить образы, когда вам нужно освободить место на диске - Используйте
--remove-orphans, чтобы очистить контейнеры, которые больше не определены в вашем файле Compose - Объединяйте эти параметры для полной очистки при необходимости
Обладая этими навыками, вы теперь лучше подготовлены к эффективному управлению средами Docker Compose в своих проектах.



