Разница между объявлением 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] в томе, и заботится об этом.