Монтирование томов
Параметр -v в docker run позволяет монтировать тома, обеспечивая совместное использование данных между хостом и контейнером. Это невероятно полезно для сохранения данных или передачи конфигурационных файлов в контейнер.
Для начала создадим простую структуру каталогов на хосте:
mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html
Эти команды выполняют следующее:
- Создают новую директорию
nginx-data внутри папки project в вашем домашнем каталоге.
- Создают простой HTML-файл
index.html внутри этой директории.
Теперь запустим контейнер Nginx и примонтируем эту директорию:
docker run -d --name nginx-volume -p 8081:80 -v ~/project/nginx-data:/usr/share/nginx/html nginx
Разберем детали команды:
docker run: команда запуска нового контейнера.
-d: запуск в фоновом режиме.
--name nginx-volume: присвоение имени "nginx-volume".
-p 8081:80: проброс порта 8081 хоста на порт 80 контейнера.
-v ~/project/nginx-data:/usr/share/nginx/html: монтирует папку nginx-data с хоста в папку /usr/share/nginx/html внутри контейнера. Именно там Nginx ищет файлы для отображения.
nginx: используемый образ.
Теперь проверим, отображается ли наша пользовательская страница:
curl http://localhost:8081
Вы должны увидеть содержимое вашего HTML-файла: "Hello from mounted volume!"
Если вы не видите этот текст, проверьте:
- Существует ли файл
~/project/nginx-data/index.html на вашей хост-системе.
- Запущен ли контейнер:
docker ps | grep nginx-volume
- Проверьте логи Nginx на наличие ошибок:
docker logs nginx-volume
Этот метод монтирования директории хоста в контейнер называется "bind mount". Это прямой способ обмена файлами. Вот несколько важных моментов:
- Путь к директории на хосте должен быть абсолютным.
- Если директория на хосте не существует, Docker создаст её автоматически.
- Любые изменения файлов в этой директории (как на хосте, так и в контейнере) будут мгновенно видны обеим сторонам.
- Будьте внимательны с правами доступа: контейнер по умолчанию работает от имени root, что может привести к созданию файлов, которые обычный пользователь хоста не сможет изменить.
Используя этот метод, мы избегаем ошибок типа "not a directory", так как монтируем целую папку. Это дает гибкость при добавлении или изменении файлов без необходимости пересоздавать контейнер.