В чем разница между Dockerfile и Docker Compose?

«В чем разница между Dockerfile и Docker Compose?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Dockerfile и Docker Compose — это взаимодополняющие инструменты, которые решают задачи на разных этапах работы с контейнерами.

Dockerfile — это текстовый скрипт с инструкциями для сборки одного Docker-образа. Он определяет, что находится внутри контейнера.

Docker Compose — это инструмент для определения и запуска мультиконтейнерных приложений. Файл docker-compose.yml описывает, как несколько контейнеров взаимодействуют друг с другом.

Пример Dockerfile (создает образ веб-приложения):

# Шаг 1: Базовый образ
FROM python:3.9-slim

# Шаг 2: Установка зависимостей
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Шаг 3: Копирование кода приложения
COPY . .

# Шаг 4: Определение точки входа
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]

Пример docker-compose.yml (оркестрирует приложение с базой данных и кэшем):

version: '3.8'
services:
  web:
    build: . # Использует Dockerfile из текущей директории
    ports:
      - "8000:8000"
    depends_on:
      - db
      - redis
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
      - REDIS_URL=redis://redis:6379

  db:
    image: postgres:14
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: pass
      POSTGRES_USER: user
      POSTGRES_DB: mydb

  redis:
    image: redis:7-alpine

volumes:
  postgres_data:

Итог:

  • docker build -f Dockerfile . создает образ.
  • docker-compose up запускает целое приложение из нескольких связанных контейнеров (web, db, redis), создавая при необходимости общие сети и тома. Это идеально для локальной разработки и тестирования сложных стэков.