Ответ
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):
- Используйте
.dockerignoreдля исключения из контекста сборки ненужных файлов (.git,__pycache__,node_modules), что ускоряет сборку и уменьшает размер образа. -
Применяйте многоэтапную сборку (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"] - Тегируйте версии явно (например,
my-app:v1.2.3,my-app:latest) для контроля над развертыванием и откатами. - Выбирайте минимальные базовые образы (
-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 .
И ждёшь, пока этот чертов демон всё соберёт. "Тэгни как мое-приложение-последняя-версия, блядь".
А теперь, чтобы не быть полным распиздяем, есть правила, ёбушки-воробушки:
-
Сделай
.dockerignore! Это чтобы не засовывать в образ всякую хуйню вроде.git, кешей илиnode_modules. Иначе образ раздует так, что мало не покажется, а сборка будет идти овердохуища времени. Элементарно, Ватсон! -
Юзай многоэтапную сборку (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"]В итоге в финальном образе нету тонны строительного мусора в виде компиляторов и исходников. Только чистое приложение. Умно, блядь!
-
Тегируй версии нормально, а не как попало! Нельзя всё клеить ярлыком
latest, это пиздец как не надёжно. Пишиmy-app:v1.2.3,my-app:stable. Чтобы если всё поехало к чёртовой матери, можно было откатиться на старую, рабочую версию, а не гадать, что за хуйня сейчас вlatestплавает. -
Бери минимальные базовые образы! Зачем тебе целый
ubuntuна гигабайт, если можно взятьpython:3.9-slimили, того лучше,alpine? Меньше размер — быстрее качается, меньше дыр для взлома. Это же логично, ёптельный театр! Зачем таскать с собой целый дистрибутив, если нужен только питон?
Вот так-то, мой друг. А то некоторые как начнут городить — один хер потом не запускается нигде, кроме ихнего ноута. Держи эти правила в голове, и будет тебе счастье, а не пиздец.