Объемы монтажа докеров на хосте

Я успешно смог обмениваться папками между контейнером докера с томами, используя

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, потому что созданные изображения должны быть переносимыми. хост-каталог не будет доступен для всех потенциальных хостов.".