В чем ключевое различие между Dockerfile и Docker Compose?

Ответ

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: Фокусируется на оркестрации и управлении несколькими контейнерами как единым приложением (как собрать несколько строительных блоков в работающую систему).