← Назад к вопросам

Как смонтировать папку или файл в контейнер в Docker

2.0 Middle🔥 111 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Монтирование папок и файлов в Docker контейнер

Монтирование (mounting) позволяет подключить части файловой системы хоста внутри контейнера. Это критично для разработки и работы приложений.

Основные способы

1. Bind Mount (классический способ)

Подключает определённую папку с хоста к папке в контейнере:

docker run -v /path/on/host:/path/in/container image

# Пример: монтируем текущую папку
docker run -v $(pwd):/app ubuntu

# На Windows:
docker run -v C:\\Users\\john\\project:/app ubuntu

# С абсолютным путём
docker run -v /home/user/data:/data ubuntu

# Read-only режим
docker run -v /host/path:/container/path:ro ubuntu

2. Volume (рекомендуемый способ)

Названные тома, управляемые Docker'ом:

# Создаём том
docker volume create my_data

# Используем том
docker run -v my_data:/app/data ubuntu

# Инспектируем том
docker volume inspect my_data

# Список всех томов
docker volume ls

# Удаляем том
docker volume rm my_data

3. Mount flag (синтаксис Docker 17.06+)

Более явный способ:

# Bind mount
docker run --mount type=bind,source=/host/path,target=/container/path ubuntu

# Volume
docker run --mount type=volume,source=my_vol,target=/data ubuntu

# tmpfs (в памяти)
docker run --mount type=tmpfs,target=/tmp ubuntu

Docker Compose

Самый удобный способ

version: '3'
services:
  app:
    image: java:11
    volumes:
      # Bind mount (абсолютный путь)
      - /home/user/app:/app
      
      # Bind mount (относительный путь от docker-compose.yml)
      - ./src:/app/src
      - ./config:/app/config
      
      # Named volume
      - app_data:/app/data
      
      # Read-only
      - ./config:/app/config:ro

volumes:
  app_data:
    # По умолчанию managed volume

Практические примеры

Java приложение с исходниками

# Во время разработки монтируем исходники
docker run \
  -v $(pwd)/src:/app/src \
  -v $(pwd)/pom.xml:/app/pom.xml \
  -v ~/.m2:/root/.m2 \
  -w /app \
  maven:3.8 \
  mvn clean install

# $(pwd) = текущая папка
# ~/.m2 = локальный Maven репозиторий

Spring Boot разработка

# Монтируем исходники и конфигурацию
docker run \
  -v $(pwd)/src:/app/src \
  -v $(pwd)/application.yml:/app/config/application.yml \
  -p 8080:8080 \
  openjdk:11 \
  java -jar myapp.jar

PostgreSQL с persistent данными

# Данные сохранятся между перезагрузками
docker run \
  -v postgres_data:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:13

nginx с конфигурацией хоста

docker run \
  -v ./nginx.conf:/etc/nginx/nginx.conf:ro \
  -v ./html:/usr/share/nginx/html:ro \
  -p 80:80 \
  nginx

Bind Mount vs Volume

Bind Mount (используем для разработки)

Плюсы:

  • Легко редактировать файлы с хоста
  • Видно прямую папку
  • Хорошо для разработки

Минусы:

  • Может быть медленнее на macOS/Windows (VM)
  • Проблемы с правами файлов (UID/GID)
docker run -v /home/user/project:/app app

Volume (используем для данных)

Плюсы:

  • Лучше производительность
  • Легче делить между контейнерами
  • Управление через Docker
  • Работает одинаково на всех ОС

Минусы:

  • Сложнее редактировать с хоста
docker run -v my_data:/app/data app

Синхронизация после монтирования

Проблема: файлы на хосте не обновляются

# НЕ РАБОТАЕТ - файл в контейнере не видно на хосте
docker run -v /tmp/data:/app/data ubuntu
echo "test" > /tmp/data/file.txt  # Нет синхронизации

# РЕШЕНИЕ - использовать proper путь или volumes
docker run -v /tmp/data:/app/data ubuntu touch /app/data/file.txt
ls /tmp/data  # Теперь видим file.txt

Права доступа

Проблема: контейнер не может писать в папку

# ❌ Проблема: контейнер работает от root, но не может писать
docker run -v /home/user/data:/data app
# Файлы в /data будут owner=root, но хост не может их удалить

# ✅ Решение 1: использовать named volume
docker run -v my_data:/data app

# ✅ Решение 2: указать пользователя
docker run --user 1000:1000 -v /home/user/data:/data app

# ✅ Решение 3: изменить права папки
chmod 777 /home/user/data

Очистка томов

# Список всех томов
docker volume ls

# Удалить конкретный том
docker volume rm my_volume

# Удалить неиспользуемые тома
docker volume prune

# Удалить неиспользуемые всё (volumes, networks, etc)
docker system prune -a --volumes

Пример полного docker-compose

version: '3.8'

services:
  app:
    build: .
    volumes:
      # Монтируем исходники
      - ./src:/app/src
      - ./pom.xml:/app/pom.xml
      
      # Монтируем конфиг
      - ./application.yml:/app/config/application.yml:ro
      
      # Named volumes для данных
      - app_logs:/app/logs
      - app_cache:/app/.cache
    
    ports:
      - "8080:8080"
    
    environment:
      - JAVA_OPTS=-Xmx512m

  postgres:
    image: postgres:13
    volumes:
      # Персистент БД данные
      - postgres_data:/var/lib/postgresql/data
      
      # Инициализирующий скрипт
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    
    environment:
      - POSTGRES_PASSWORD=secret

volumes:
  postgres_data:
  app_logs:
  app_cache:

Резюме

Монтирование в Docker:

  1. Bind mount (-v /host:/container) - для разработки
  2. Volume (-v name:/container) - для данных
  3. Mount flag (--mount) - явный способ
  4. Docker Compose (volumes:) - самый удобный

Используй bind mount для разработки (быстро редактировать), и named volumes для данных (лучше производительность).

Как смонтировать папку или файл в контейнер в Docker | PrepBro