Объемы монтажа докеров на хосте
Я успешно смог обмениваться папками между контейнером докера с томами, используя
docker run -v /host/path:/container/path ...
Но мой вопрос в том, какая разница между этим и использование команды VOLUME
в Dockerfile
VOLUME /path
Я использую изображение с командой VOLUME
, и я хотел бы знать, как поделиться им с моим хостом. Я сделал это с помощью команды -v
выше, но я не знал, нужны ли мне как теги -v
, так и VOLUME
.
Ответы
Ответ 1
Команда VOLUME
смонтирует каталог внутри вашего контейнера и сохранит любые файлы, созданные или отредактированные внутри этого каталога на диске хостов вне файловой структуры контейнера, минуя файловую систему union.
Идея заключается в том, что ваши тома могут быть разделены между вашими контейнерами докеров, и они будут оставаться там до тех пор, пока там не будет контейнер (работает или остановлен), который ссылается на них.
У вас могут быть другие контейнеры, которые монтируют существующие тома (эффективно разделяя их между контейнерами) с помощью команды --volumes-from
при запуске контейнера.
Фундаментальное различие между VOLUME
и -v
заключается в следующем: -v
будет монтировать существующие файлы из вашей операционной системы внутри вашего контейнера докеров, а VOLUME
создаст новый пустой уровень на вашем хосте и смонтирует его внутри ваш контейнер.
Пример:
- У вас есть файл Docker, который определяет
VOLUME /var/lib/mysql
.
- Вы создаете изображение докеры и отмечаете его
some-volume
- Вы запускаете контейнер
И затем,
- У вас есть другое изображение докеры, которое вы хотите использовать в этом томе
- Вы запускаете контейнер докера следующим образом:
docker run --volumes-from some-volume docker-image-name:tag
- Теперь у вас есть контейнер для докеров, который будет иметь объем от
some-volume
, установленный в /var/lib/mysql
Примечание. Использование --volumes-from
будет монтировать том по сравнению с тем, что существует в месте расположения тома. Если у вас есть материал в /var/lib/mysql
, он будет заменен содержимым тома.
Ответ 2
Позвольте мне добавить свой собственный ответ, потому что я считаю, что другим не хватает точки Docker.
Использование VOLUME
в файле Docker - это правильный путь, потому что вы даете Docker знать, что определенный каталог содержит постоянные данные. Docker создаст том для этих данных и никогда не удалит его, даже если вы удалите все контейнеры, которые его используют.
Он также обходит файловую систему union, так что том фактически является фактическим каталогом, который монтируется (read-write или readonly) в нужном месте во всех контейнерах, которые его используют.
Теперь, чтобы получить доступ к этим данным с хоста, вам нужно только осмотреть свой контейнер:
# docker inspect myapp
[{
.
.
.
"Volumes": {
"/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
"/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
"/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
},
"VolumesRW": {
"/var/www": false,
"/var/cache/nginx": true,
"/var/log/nginx": true
}
}]
То, что я обычно делаю, это сделать символические ссылки в каком-то стандартном месте, например /srv , чтобы я мог легко получить доступ к томам и управлять содержащимися ими данными (только для томов, о которых вы заботитесь):
ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log
Ответ 3
В основном VOLUME
и -v
параметры почти равны. Это означает "установить конкретный каталог на вашем контейнере". Например, VOLUME /data
и -v /data
- это точно такое же значение. Если вы запустите изображение с VOLUME /data
или с параметром -v /data
, каталог /data
будет смонтирован в вашем контейнере. Этот каталог не принадлежит вашему контейнеру.
Представьте, что вы добавляете некоторые файлы в /data
в контейнере, а затем вставляете контейнер в новое изображение. В каталоге данных нет файлов, поскольку установленный каталог /data
принадлежит оригинальному контейнеру.
$ docker run -it -v /data --name volume ubuntu:14.04 bash
[email protected]:/# cd /data
[email protected]:/data# touch 1 2 3 4 5 6 7 8 9
[email protected]:/data# cd /tmp
[email protected]:/tmp# touch 1 2 3 4 5 6 7 8 9
[email protected]:/tmp# exit
exit
$ docker commit volume nacyot/volume
835cfe3d8d159622507ba3256bb1c0b0d6e7c1419ae32751ad0f925c40378945
nacyot $ docker run -it nacyot/volume
[email protected]:/# cd /data
[email protected]:/data# ls
[email protected]:/data# cd /tmp
[email protected]:/tmp# ls
1 2 3 4 5 6 7 8 9
[email protected]:/tmp#
[email protected]:/tmp#
Этот смонтированный каталог, например /data
, используется для хранения данных, которые не принадлежат вашему приложению. И вы можете предопределить каталог данных, который не принадлежит контейнеру, с помощью VOLUME
.
Разница между опциями VOLUME
и -v
заключается в том, что вы можете использовать опцию -v
динамически при запуске контейнера. Это означает, что вы можете смонтировать какой-то каталог динамически. И еще одно отличие заключается в том, что вы можете установить свой каталог хоста на свой контейнер, используя -v
Ответ 4
VOLUME используется в Dockerfile
, чтобы открыть том, который будет использоваться другими контейнерами. Например, создайте Dockerfile
как:
FROM ubuntu: 14.04
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
создать изображение:
$ docker build -t testing_volume .
Запустите контейнер, скажем, контейнер1:
$ docker run -it <image-id of above image> bash
Теперь запустите другой контейнер с параметрами томов из опции as (say-container2)
$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash
Вы получите все данные из каталога container1 /myvol
в контейнер2 в том же месте.
-v
задается во время выполнения контейнера, который используется для монтирования каталога контейнера на хосте. Он прост в использовании, просто укажите параметр -v
с аргументом как <host-path>:<container-path>
. Вся команда может быть как $ docker run -v <host-path>:<container-path> <image-id>
Ответ 5
Это из самой документации Docker, может быть полезной, простой и простой:
"Каталог хоста по своей природе зависит от хоста. По этой причине вы не можете установить каталог хоста из Dockerfile, инструкция VOLUME не поддерживает передачу host-dir, потому что созданные изображения должны быть переносимыми. хост-каталог не будет доступен для всех потенциальных хостов.".