PRO

Что такое volumes и bind mounts? В чём разница?

Volumes и bind mounts позволяют хранить данные вне изменяемого слоя контейнера. Docker volume управляется самим Docker и обычно подходит для постоянных данных, например базы данных; bind mount связывает конкретную папку хоста с путём внутри контейнера и удобен для исходного кода во время разработки.
Подробный ответ

Зачем нужны mounts

Данные внутри writable layer контейнера не стоит считать постоянными: при удалении контейнера они пропадут. Mounts позволяют хранить данные отдельно от жизненного цикла конкретного контейнера.

Docker volumes

Volume — это хранилище, которое создаётся и управляется Docker. Docker определяет, где оно находится на хосте, и может подключать один volume к контейнеру или нескольким контейнерам.

services:
  db:
    image: postgres:16
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Named volumes обычно хорошо подходят для данных PostgreSQL, Redis и других сервисов, потому что Docker управляет их расположением и жизненным циклом.

Bind mounts

Bind mount привязывает конкретный путь хостовой файловой системы к пути внутри контейнера. Изменения в файлах на хосте сразу видны внутри контейнера, и наоборот.

services:
  web:
    build: .
    volumes:
      - ./src:/app/src

Основная разница

  • volume управляется Docker, а bind mount использует указанный путь на хосте;

  • volume лучше подходит для постоянных данных сервисов;

  • bind mount удобен для локальной разработки и редактирования исходного кода;

  • bind mount сильнее зависит от структуры файловой системы и прав на конкретной машине.

Read-only mount

Если контейнеру не нужно менять подключённые файлы, mount можно сделать доступным только для чтения.

volumes:
  - ./nginx.conf:/etc/nginx/nginx.conf:ro

Как ответить на собеседовании

Volume — это постоянное хранилище под управлением Docker, его обычно использую для данных базы. Bind mount — это прямая привязка папки хоста к папке контейнера; он удобен в development, когда нужно сразу видеть изменения исходного кода в контейнере.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге