DockerJuniorTechnical
Что произойдёт с данными внутри контейнера после docker rm? Где это «внутри» физически живёт на хосте?
Writable layer контейнера удаляется с docker rm. Named volumes переживают rm и лежат в /var/lib/docker/volumes/. Image layers остаются, пока есть ссылки. Для state — volume или внешнее хранилище, никогда не writable layer.
Слои контейнера
Файловая система контейнера — стек overlay2: внизу read-only image layers, сверху writable layer (upperdir). Всё, что приложение пишет не в volume, попадает в этот upperdir. После docker rm writable layer удаляется. Image layers остаются — они shared между контейнерами и удаляются только когда последний reference исчез и выполнен docker image prune.
Где это на диске
docker info --format '{{.DockerRootDir}}'
# /var/lib/docker
ls /var/lib/docker/
# overlay2/ volumes/ containers/ image/ network/
docker inspect demo --format '{{.GraphDriver.Data.UpperDir}}'
# /var/lib/docker/overlay2/<id>/diff ← writable layer
ls /var/lib/docker/volumes/appdata/_data
# содержимое named volume
Демонстрация
# 1) запись в writable layer — теряется
docker run --name demo alpine sh -c 'echo hi > /file'
docker rm demo
# файла больше нет нигде
# 2) запись в named volume — сохраняется
docker volume create appdata
docker run --name demo2 -v appdata:/data alpine sh -c 'echo hi > /data/file'
docker rm demo2
docker run --rm -v appdata:/data alpine cat /data/file
# hi
# 3) явное удаление volume
docker volume rm appdata
Виды mount
- named volume (
-v name:/path) — управляется Docker, переживаетrm. - anonymous volume (
-v /path) — без имени, очищается черезdocker rm -vилиvolume prune. - bind mount (
-v /host/path:/path) — путь на хосте, Docker не управляет lifecycle. - tmpfs (
--tmpfs /tmp) — RAM, исчезает при stop.
Подводные камни
docker rmбез-vоставляет anonymous volumes висеть —docker volume ls -f dangling=trueдля аудита.docker-compose down -vудаляет named volumes — легко потерять БД; для prod используйтеdownбез-v.- Не редактируйте
/var/lib/docker/overlay2руками — metadata вimage/overlay2/layerdbрассинхронизируется. - На macOS/Windows volume лежит внутри VM,
du -shна хосте показывает виртуальный диск целиком. - SELinux: bind mount без
:Z/:zдастpermission denied. - Stateful сервисы (Postgres, Redis с AOF) — всегда named volume или внешний storage, не writable layer.
- Логи stdout/stderr пишутся в
/var/lib/docker/containers/<id>/<id>-json.logи пропадают вместе с контейнером.
Common mistakes
- Ожидать, что файлы в контейнере переживут docker rm без volume.
- Удалять или править /var/lib/docker вручную для cleanup.
- Не отличать anonymous volume от named volume при удалении.
What the interviewer is testing
- Объясняет writable layer и его удаление.
- Понимает persistence через volumes and bind mounts.
- Знает, что Docker data root не является ручным API.