← Назад к вопросам
Как смонтировать папку или файл в контейнер в 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:
- Bind mount (-v /host:/container) - для разработки
- Volume (-v name:/container) - для данных
- Mount flag (--mount) - явный способ
- Docker Compose (volumes:) - самый удобный
Используй bind mount для разработки (быстро редактировать), и named volumes для данных (лучше производительность).