Docker-образ — стек неизменяемых (read-only) слоёв. Каждая инструкция Dockerfile, изменяющая файловую систему, создаёт новый слой поверх предыдущего. При запуске контейнера Docker добавляет поверх read-only слоёв один записываемый слой (container layer). Все изменения в контейнере попадают только в этот слой и теряются при удалении контейнера.
Как работают слои
FROM ubuntu:22.04 # Слой 1: базовый образ
RUN apt update && apt install nginx # Слой 2: nginx
COPY ./site /var/www/html # Слой 3: файлы сайта
RUN chmod -R 755 /var/www # Слой 4: права
EXPOSE 80
Слои 1–4 создаются при сборке (docker build). При изменении инструкции Dockerfile слои ниже неё кешированы, слои выше — пересобираются.
Оптимизация слоёв
Число слоёв влияет на размер образа и скорость сборки. Лучшие практики:
- Объединять RUN-команды через
&&в один слой. - Очищать кеш пакетного менеджера в том же слое:
RUN apt install nginx && rm -rf /var/lib/apt/lists/* - COPY файлы, меняющиеся редко, в начало; меняющиеся часто — в конец.
- Multi-stage builds для уменьшения финального образа.
История
Концепция слоёв образов пришла от AUFS (Another Union File System), впервые использованной в Docker 0.1 (2013). AUFS заменён на overlay2 (2015) в Linux 3.18+. В 2017 году OCI (Open Container Initiative) стандартизировал формат образов. Overlay2 — стандартный storage driver Docker в 2024 году.
Связь с хостингом
Понимание слоёв важно при работе с Docker-реестрами (Docker Hub, GitLab Registry): при push/pull передаются только отсутствующие слои, что экономит трафик. На VDS с ограниченным диском команда docker image prune удаляет висячие слои. Оптимизация Dockerfile напрямую влияет на скорость CI/CD-пайплайна.
История слоёв в Docker
Слоистая файловая система в Docker основана на UnionFS, впервые применённой в 2005 году. Docker 0.1 (2013) использовал AUFS (Advanced Union File System). Overlay2 стал рекомендуемым драйвером с Docker 18.09 (2018) и встроен в ядро Linux 3.18+. Каждый слой — неизменяемый tar-архив с дельтой изменений ФС. Идентифицируется по SHA256-хешу. Слои кешируются и переиспользуются между образами.
Как работают слои на практике
При сборке Dockerfile каждая инструкция (RUN, COPY, ADD) создаёт новый слой. Инструкции ENV, EXPOSE, CMD — метаданные, слои не создают. Изменение инструкции инвалидирует кеш всех последующих слоёв — поэтому COPY package.json . ставят перед RUN npm install.
docker history nginx:latest # показать слои образа
docker inspect nginx:latest # подробная информация о слоях
Оптимизация слоёв на хостинге
Минимизация количества слоёв ускоряет деплой на VPS: объединяйте RUN apt-get update && apt-get install -y ... && rm -rf /var/lib/apt/lists/* в один слой. Multi-stage builds позволяют не включать компилятор в финальный образ. Слои хранятся в /var/lib/docker/overlay2/ и могут занимать значительное место — чистите командой docker system prune.
Типичные ошибки
- Хранение секретов в промежуточных слоях образа: даже удалённые в
RUNфайлы видны в истории слоёв. - Использование
:latestтега в продакшне: неконтролируемые обновления. - Слишком большой базовый образ (ubuntu вместо alpine): образ 200 MB против 5 MB.
Слои в образах минимизируют время деплоя на VPS: только изменённые слои передаются при обновлении образа. Базовые образы (alpine: 5 MB, debian:slim: 80 MB, ubuntu: 78 MB) определяют стартовый набор слоёв. Инструмент Buildah позволяет собирать OCI-образы слой за слоем без Docker daemon, а Nginx официальный образ состоит из 3-4 слоёв.