Что такое Docker Image и как его создать?

Ответ

Docker Image — это неизменяемый шаблон, содержащий приложение, все его зависимости, конфигурацию и инструкции для запуска контейнера. Это упакованная, переносимая единица развертывания.

Создание образа происходит через Dockerfile — текстовый файл с инструкциями:

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

# Установка рабочей директории внутри контейнера
WORKDIR /app

# Копирование файла зависимостей и их установка
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копирование исходного кода приложения
COPY . .

# Команда для запуска контейнера
CMD ["python", "app.py"]

Сборка образа выполняется командой:

docker build -t my-app:latest .

Ключевые практики (Best Practices):

  1. Используйте .dockerignore для исключения из контекста сборки ненужных файлов (.git, __pycache__, node_modules), что ускоряет сборку и уменьшает размер образа.
  2. Применяйте многоэтапную сборку (Multi-stage builds) для создания минимальных образов. Например, использовать один этап для сборки, а другой — только для рантайма:

    FROM python:3.9 AS builder
    COPY requirements.txt .
    RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt
    
    FROM python:3.9-slim
    COPY --from=builder /wheels /wheels
    RUN pip install --no-cache-dir /wheels/*
    COPY . /app
    CMD ["python", "app.py"]
  3. Тегируйте версии явно (например, my-app:v1.2.3, my-app:latest) для контроля над развертыванием и откатами.
  4. Выбирайте минимальные базовые образы (-slim, alpine), чтобы уменьшить поверхность атаки и размер образа.

Ответ 18+ 🔞

Так, слушай, про Docker Image, это ж как консервная банка, только для софта, блядь. Представь себе: берёшь своё приложение, все его библиотеки, настройки, инструкцию "как открыть" — и запаковываешь в одну ебаную, неизменяемую хуйню. Получается этакий цифровой консервный блин, который потом можно таскать куда угодно и он везде запустится одинаково. Красота, ёпта!

А делается эта банка-спасительница через файлик Dockerfile. Это типа рецепта, инструкции для долбоёба-демона, что ему делать.

# Берём какую-нибудь готовую основу, чтоб не с нуля городить
FROM python:3.9-slim

# Говорим: "Демон, внутри контейнера вся работа будет в папке /app, запомнил, мудень?"
WORKDIR /app

# Тащим файлик с зависимостями и ставим их
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Теперь тащим весь наш код, весь этот сраный проект
COPY . .

# И главная команда: "Демон, когда банку откроют, запусти вот это!"
CMD ["python", "app.py"]

Чтобы по этому рецепту слепить образ, орешь в консоль:

docker build -t my-app:latest .

И ждёшь, пока этот чертов демон всё соберёт. "Тэгни как мое-приложение-последняя-версия, блядь".

А теперь, чтобы не быть полным распиздяем, есть правила, ёбушки-воробушки:

  1. Сделай .dockerignore! Это чтобы не засовывать в образ всякую хуйню вроде .git, кешей или node_modules. Иначе образ раздует так, что мало не покажется, а сборка будет идти овердохуища времени. Элементарно, Ватсон!

  2. Юзай многоэтапную сборку (Multi-stage builds). Это вообще гениальная штука, чтобы на выходе получить образ размером с чих. Смысл: один этап — это стройплощадка, где всё компилируется и собирается в пиздабольские кучи. А второй этап — это уже чистая квартира, куда ты заносишь только готовую мебель из первой. Смотри, как красивше:

    # Этап 1: Стройплощадка. Здесь собираем все колеса (зависимости)
    FROM python:3.9 AS builder
    COPY requirements.txt .
    RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt
    
    # Этап 2: Чистая квартира. Берём только самое необходимое.
    FROM python:3.9-slim
    # Тащим сюда готовые колеса со стройки
    COPY --from=builder /wheels /wheels
    RUN pip install --no-cache-dir /wheels/*
    # И уже свой код
    COPY . /app
    CMD ["python", "app.py"]

    В итоге в финальном образе нету тонны строительного мусора в виде компиляторов и исходников. Только чистое приложение. Умно, блядь!

  3. Тегируй версии нормально, а не как попало! Нельзя всё клеить ярлыком latest, это пиздец как не надёжно. Пиши my-app:v1.2.3, my-app:stable. Чтобы если всё поехало к чёртовой матери, можно было откатиться на старую, рабочую версию, а не гадать, что за хуйня сейчас в latest плавает.

  4. Бери минимальные базовые образы! Зачем тебе целый ubuntu на гигабайт, если можно взять python:3.9-slim или, того лучше, alpine? Меньше размер — быстрее качается, меньше дыр для взлома. Это же логично, ёптельный театр! Зачем таскать с собой целый дистрибутив, если нужен только питон?

Вот так-то, мой друг. А то некоторые как начнут городить — один хер потом не запускается нигде, кроме ихнего ноута. Держи эти правила в голове, и будет тебе счастье, а не пиздец.