Введение
Команда Docker Compose Down — это важный инструмент для управления контейнерами Docker. В этой лабораторной работе вы научитесь эффективно использовать docker-compose down для правильной остановки и очистки контейнеров, сетей, томов и образов Docker. Освоив эту команду, вы сможете поддерживать чистоту среды Docker и оптимизировать свой рабочий процесс разработки.
Установка Docker Compose и создание примера проекта
На этом этапе мы убедимся, что Docker Compose установлен правильно, и создадим пример проекта Docker Compose для работы.
Проверка установки Docker Compose
Сначала проверим, была ли успешно установлена утилита Docker Compose:
docker-compose version
Вы должны увидеть вывод, похожий на этот (детали сборки могут отличаться):
docker-compose version 1.29.2, build unknown
Создание простого файла 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. Они называются «осиротевшими» (orphan containers).
Чтобы продемонстрировать это, давайте изменим наш файл 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 с помощью флага справки:
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
Вы должны увидеть вывод, показывающий создание сетей, томов и контейнеров для всех трех сервисов.
Лучшая практика: Использование окружений
В реальных сценариях у вас могут быть разные окружения, такие как разработка (development), тестирование (testing) и продакшн (production). 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 в своих проектах.



