Ответ
Dockerfile и Docker Compose — это инструменты экосистемы Docker, но они служат разным целям в процессе контейнеризации приложений.
Dockerfile
- Назначение:
Dockerfile
— это текстовый файл, содержащий пошаговые инструкции для сборки одного Docker-образа. - Что описывает: Он определяет базовый образ, устанавливает зависимости, копирует файлы приложения, настраивает переменные окружения и указывает команду для запуска приложения внутри контейнера.
- Почему используется: Позволяет воспроизводимо создавать изолированные, переносимые образы, содержащие все необходимое для запуска конкретного приложения или сервиса.
-
Пример:
# Используем официальный образ Python как базовый FROM python:3.9-slim-buster # Устанавливаем рабочую директорию внутри образа WORKDIR /app # Копируем файл зависимостей и устанавливаем их COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Копируем остальной код приложения COPY . . # Определяем команду, которая будет выполняться при запуске контейнера CMD ["python", "app.py"]
Docker Compose
- Назначение:
Docker Compose
— это инструмент для определения и запуска многоконтейнерных Docker-приложений. - Что описывает: Использует YAML-файл (
docker-compose.yml
) для описания нескольких взаимосвязанных сервисов (контейнеров), их настроек, сетей, томов и переменных окружения. Позволяет управлять всем приложением как единым целым. - Почему используется: Упрощает разработку, тестирование и развертывание сложных приложений, состоящих из нескольких компонентов (например, веб-сервер, база данных, кэш, очередь сообщений). Позволяет запускать, останавливать и масштабировать все сервисы одной командой.
-
Пример:
version: '3.8' services: web: # Сборка образа из Dockerfile в текущей директории build: . # Проброс портов: хост:контейнер ports: - "5000:5000" # Зависимость от сервиса 'redis' depends_on: - redis # Переменные окружения для сервиса 'web' environment: REDIS_HOST: redis redis: # Использование готового образа Redis image: "redis:alpine" # Определение тома для сохранения данных Redis volumes: - redis_data:/data # Определение томов, которые будут использоваться сервисами volumes: redis_data:
Ключевое различие
- Dockerfile: Фокусируется на сборке одного Docker-образа (как создать строительный блок).
- Docker Compose: Фокусируется на оркестрации и управлении несколькими контейнерами как единым приложением (как собрать несколько строительных блоков в работающую систему).