Эффективное использование команды docker-compose down

DockerBeginner
Практиковаться сейчас

Введение

Команда 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

Обратите внимание, что команда:

  1. Останавливает все работающие контейнеры, определенные в вашем файле Docker Compose
  2. Удаляет все контейнеры
  3. Удаляет сеть, созданную 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

Эта команда:

  1. Остановит и удалит все контейнеры
  2. Удалит все именованные тома
  3. Удалит все образы, используемые любой службой
  4. Удалит любые контейнеры-сироты

Это особенно полезно, когда вы хотите полностью сбросить свою среду или когда вы готовитесь внести значительные изменения в конфигурацию 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

Лучшая практика: выборочное удаление ресурсов

Иногда вам может потребоваться удалить только определенные ресурсы. Например, вы можете захотеть сохранить свои тома (для сохранения данных), но удалить контейнеры, сети и образы.

Вот как вы будете подходить к различным сценариям:

  1. Удалить только контейнеры и сети (сохранить тома и образы):

    docker-compose down
  2. Удалить контейнеры, сети и образы (сохранить тома):

    docker-compose down --rmi all
  3. Удалить контейнеры, сети и тома (сохранить образы):

    docker-compose down --volumes
  4. Удалить только локальные образы (не извлеченные из реестра):

    docker-compose down --rmi local

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

Лучшая практика: мониторинг использования ресурсов

До и после запуска docker-compose down часто полезно отслеживать использование ресурсов Docker. Это может помочь вам выявить любые ресурсы, которые не очищаются должным образом.

Вот несколько полезных команд:

  1. Вывести список всех контейнеров (включая остановленные):

    docker ps -a
  2. Вывести список всех сетей:

    docker network ls
  3. Вывести список всех томов:

    docker volume ls
  4. Вывести список всех образов:

    docker image ls
  5. Получить общесистемную информацию:

    docker system df

Давайте попробуем последнюю команду, чтобы увидеть текущее использование ресурсов:

docker system df

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

Выключение нашей сложной среды

Теперь давайте выключим нашу сложную среду и удалим все связанные ресурсы:

docker-compose down --volumes --rmi all --remove-orphans

Это остановит и удалит все контейнеры, сети, тома и образы, связанные с нашим проектом Docker Compose.

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

Резюме

В этой лабораторной работе вы узнали, как эффективно использовать команду docker-compose down для управления вашими контейнерами и ресурсами Docker. Вот краткий обзор того, что вы сделали:

  1. Установили Docker Compose и создали простую среду Docker Compose
  2. Изучили основы docker-compose down и то, как она удаляет контейнеры и сети по умолчанию
  3. Рассмотрели расширенные параметры, такие как --volumes, --rmi и --remove-orphans, чтобы точно контролировать, какие ресурсы удаляются
  4. Реализовали лучшие практики использования Docker Compose в реальных сценариях, включая:
    • Использование файлов конфигурации, специфичных для среды
    • Создание скриптов очистки
    • Выборочное удаление ресурсов
    • Мониторинг использования ресурсов

Освоив команду docker-compose down, вы теперь обладаете знаниями для поддержания чистой среды Docker, предотвращения утечек ресурсов и оптимизации рабочего процесса разработки.

Запомните эти ключевые моменты:

  • Базовая команда docker-compose down удаляет контейнеры и сети, но сохраняет тома
  • Используйте --volumes, чтобы удалить тома, когда вы хотите сбросить свои данные
  • Используйте --rmi, чтобы удалить образы, когда вам нужно освободить место на диске
  • Используйте --remove-orphans, чтобы очистить контейнеры, которые больше не определены в вашем файле Compose
  • Объединяйте эти параметры для полной очистки при необходимости

Обладая этими навыками, вы теперь лучше подготовлены к эффективному управлению средами Docker Compose в своих проектах.