Изображения Docker

Тема дорожной карты · Docker & Containers

Образ Docker представляет собой неизменяемую слоёную файловую систему, дополненную конфигурационным блобом, который описывает, как запускать контейнер. Образы создаются из Dockerfile с помощью команды docker build (или docker buildx build) и тегируются как repo:tag. Команды docker images и docker image ls выводят список локальных образов, в то время как docker image prune удаляет ненужные образы. Одной из распространённых ошибок при работе с Docker является использование изменяемого тега :latest в продакшене, что может привести к непредсказуемым результатам, поскольку каждый запуск может быть основан на разных версиях образа. Также важно помнить, что внутри образа файлы адресуются по digest, что позволяет убедиться в целостности и воспроизводимости контейнеров.

Как это работает

Изображения Docker хранятся в виде стека read-only слоёв, каждый из которых содержит изменения, внесённые командами Dockerfile. Каждая команда RUN, COPY или ADD создаёт новый слой, который может быть кэширован, если родительский слой и команда не изменились. Теги (repo:tag) являются изменяемыми указателями, которые могут быть использованы для обозначения различных версий одного и того же образа. Внутри Docker контейнеров файлы адресуются по SHA-256 digest, что обеспечивает уникальность и воспроизводимость каждого образа. Multi-stage сборки (FROM base AS builderFROM slimCOPY --from=builder) позволяют создавать более компактные и оптимизированные образы, убирая промежуточные слои, которые не нужны для запуска окончательного контейнера.

Когда применять

Сортировка инструкций в Dockerfile от наименее- к наиболее-часто-меняющимся (системные зависимости → зависимости приложения → исходный код приложения) позволяет максимизировать попадание в кэш. Это особенно полезно при использовании multi-stage сборок, где финальный образ требует меньше ресурсов, чем образ, используемый для сборки. Закрепление базовых образов по digest (FROM node:22-alpine@sha256:...) обеспечивает воспроизводимость контейнеров, так как каждый запуск будет основан на точно таком же образе. Использование файла .dockerignore позволяет исключить ненужные файлы и директории из процесса сборки, что уменьшает размер образа и ускоряет процесс сборки.

Типичные ошибки

Одной из распространённых ошибок при работе с Docker является использование изменяемого тега :latest в продакшене. Поскольку тег :latest постоянно обновляется, каждый запуск контейнера может быть основан на разных версиях образа, что может привести к непредсказуемым результатам. Также распространённой ошибкой является использование команды apt-get update без последующего удаления временных файлов (rm -rf /var/lib/apt/lists/*), что может привести к увеличению размера образа. Уничтожение кэша из-за команды COPY . . перед командой RUN npm install также является распространённой ошибкой, так как это приводит к тому, что каждый раз, когда исходный код изменяется, образ перестраивается с нуля. Важно использовать специальные команды для загрузки секретов и конфигураций, чтобы избежать их хранения в слоях образа.

Связанные понятия

Полезные ресурсы