Монтирование томов
Параметр -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
: Это запускает контейнер в фоновом режиме (detached mode).
--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", так как мы монтируем каталог, а не отдельный файл. Этот подход дает вам больше гибкости для добавления, удаления или изменения файлов без необходимости пересоздавать контейнер.