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.

Sources

Related topics