Разница между объявлением VOLUME в файле Dockerfile и -v как параметром запуска докера
Может ли кто-нибудь помочь мне понять разницу между:
Команда VOLUME
в Dockerfile
(слой построения изображения)
и
Параметр -v
при выдаче команды docker run
-v/xyz/bla
(уровень построения контейнера).
Параметр -v
для меня понятен, он просто предоставляет каталог от хоста к контейнеру и наоборот, но как VOLUME
в Dockerfile
ведет себя по-другому?
Ответы
Ответ 1
Параметр -v
и ключевое слово VOLUME
почти одинаковы. Вы можете использовать -v
для того же поведения, что и VOLUME
.
docker run -v /data
То же, что и
VOLUME /data
Но также - у вас больше применений, один из них - это карта с томом:
docker run -v data:/data # Named volumes
docker run -v /var/data:/data # Host mounted volumes, this is what you refer to -v use, but as you can see there are more uses,
Итак, вопрос в том, каково использование VOLUME
в Dockerfile
?
Контейнерная файловая система состоит из слоев, поэтому запись там медленнее и ограничена (из-за фиксированного количества слоев), чем простая файловая система.
Вы объявляете VOLUME
в своем Dockerfile
, чтобы указать, где ваш контейнер будет записывать данные приложения. Например, контейнер базы данных, его данные будут поступать в том, независимо от того, что вы положили в свой docker run
.
Если вы создаете контейнер-докер для JBoss и хотите использовать быстрый доступ к файловой системе с помощью libaio
, вам нужно объявить каталог данных как VOLUME
или JBoss сработает при запуске.
В заключение VOLUME
объявляет том независимо от того, что вы делаете в docker run
. Фактически в docker run
вы не можете отменить объявление VOLUME
, сделанное в Dockerfile
.
Привет
Ответ 2
В двух словах
Инструкция VOLUME [PATH]
внутри Dockerfile эквивалентна
$ docker run -v $(docker volume create):[PATH] [IMAGE_NAME]
Подробное объяснение
Контейнерная файловая система состоит из слоев, поэтому запись там происходит медленнее и ограниченнее (потому что фиксированное количество слоев), чем простая файловая система.
Использование томов в Docker в первую очередь зависит не от скорости, а от устойчивости данных, не зависящей от жизненного цикла контейнера. Монтирование томов с более быстрого диска, очевидно, повысит производительность, но поведение Docker по умолчанию для VOLUME
заключается в создании именованный том в хост-системе с незначительным улучшением скорости по сравнению с уровнем записи в контейнеры.
Параметр -v
для меня понятен, он просто выставляет каталог от хоста к контейнеру и наоборот
Хотя это отчасти верно, -v
также можно использовать для монтирования именованных томов в ваш контейнер Docker вместо каталога. Эта небольшая деталь важна для понимания того, что делает VOLUME
. Пример:
$ docker volume create my_volume
$ docker run -v my_volume:[PATH] [IMAGE_NAME]
Здесь был создан том с именем my_volume
. Он ведет себя так, как и ожидалось от "нормального" монтирования. Любые изменения в [PATH]
внутри контейнера будут сохранены в этом томе. Разница в том, что Docker управляет расположением тома, так что вам не нужно беспокоиться (это /var/lib/docker/volumes/my_volume/_data
на тот случай, если вам интересно). Зачем тебе это? Вы можете иметь тестовую базу данных. Хотя вам не нужен прямой доступ к файлам, вы можете сохранить текущее состояние, чтобы смонтировать его в другие контейнеры базы данных.
Инструкция VOLUME [PATH]
в основном сохраняет вышеприведенные инструкции в метаинформацию изображения. Поэтому каждый раз, когда вы запускаете контейнер с этого образа, Docker знает, что вы хотите сохранить [PATH]
в томе, и заботится об этом.