docker монтирование томов на хосте
я успешно смог обмениваться папками между контейнером docker с томами с помощью
docker run -v /host/path:/container/path ...
но мой вопрос в том, какая разница между этим и использованием VOLUME команда в Dockerfile
VOLUME /path
Я использую изображение, которое имеет VOLUME команда, и я хотел бы знать, как поделиться им с моим хозяином. Я сделал это с помощью -v команда выше, но я не знал, нужны ли мне оба -v и VOLUME.
5 ответов:
The
VOLUMEкоманда смонтирует каталог внутри вашего контейнера и сохранит все файлы, созданные или отредактированные внутри этого каталога на вашем диске хостов вне структуры файла контейнера, минуя файловую систему объединения.идея заключается в том, что ваши Тома могут быть разделены между вашими контейнерами docker, и они будут оставаться вокруг, пока есть контейнер (запущенный или остановленный), который ссылается на них.
вы можете иметь другие контейнеры гора существующие Тома (эффективно разделяя их между контейнерами) с помощью при запуске контейнера.
принципиальная разница между
VOLUMEи-vэто:-vбудет монтировать существующие файлы из вашей операционной системы внутри вашего контейнера docker иVOLUMEбудет создать новый, пустой объем на вашем Хосте и установите его внутри контейнера.пример:
- у вас есть Dockerfile, который определяет а
VOLUME /var/lib/mysql.- вы создаете изображение docker и помечаете его
some-volume- вы запускаете контейнер
и
- у вас есть еще один образ докера, который вы хотите использовать этот том
- вы запускаете контейнер docker со следующим:
docker run --volumes-from some-volume docker-image-name:tag- теперь у вас есть контейнер docker работает, который будет иметь объем от
some-volumeустановленный в/var/lib/mysqlПримечание: С Помощью
--volumes-fromбудет установите том поверх всего, что существует в расположении Тома. То есть, если бы у вас были вещи в/var/lib/mysql, он будет заменен на содержимое тома.
позвольте мне добавить свой собственный ответ, потому что я считаю, что другие упускают смысл Докера.
используя
VOLUMEв Dockerfile это правильный путь™, потому что вы даете Docker знать, что определенный каталог содержит постоянные данные. Docker создаст том для этих данных и никогда не удалит его, даже если вы удалите все контейнеры, которые его используют.Он также обходит файловую систему union, так что Том фактически является фактическим каталогом, который монтируется (чтение-запись или 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
в принципе
VOLUMEи-vопции почти равны. Они означают "монтировать определенный каталог на вашем контейнере". Например,VOLUME /dataи-v /dataэто точно такое же значение. Если вы запустите изображение, которое имеетVOLUME /dataили ,/dataкаталог монтируется ваш контейнер. Этот каталог не принадлежит вашему контейнеру.представьте, что вы добавляете некоторые файлы в
/dataна контейнере, затем зафиксируйте контейнер в новом образе. Там нет никаких файлов на данных каталог, потому что смонтирован/dataкаталог принадлежит к исходному контейнеру.$ docker run -it -v /data --name volume ubuntu:14.04 bash root@2b5e0f2d37cd:/# cd /data root@2b5e0f2d37cd:/data# touch 1 2 3 4 5 6 7 8 9 root@2b5e0f2d37cd:/data# cd /tmp root@2b5e0f2d37cd:/tmp# touch 1 2 3 4 5 6 7 8 9 root@2b5e0f2d37cd:/tmp# exit exit $ docker commit volume nacyot/volume 835cfe3d8d159622507ba3256bb1c0b0d6e7c1419ae32751ad0f925c40378945 nacyot $ docker run -it nacyot/volume root@dbe335c7e64d:/# cd /data root@dbe335c7e64d:/data# ls root@dbe335c7e64d:/data# cd /tmp root@dbe335c7e64d:/tmp# ls 1 2 3 4 5 6 7 8 9 root@dbe335c7e64d:/tmp# root@dbe335c7e64d:/tmp#этот каталог, как
/dataиспользуется для хранения данных, которые не относятся к вашему приложению. И вы можете заранее определить каталог данных, который не принадлежит контейнеру с помощьюVOLUME.разницу между
Volumeи заключается в том, что вы можете использовать динамически при запуске контейнера. Это означает, что вы можете динамически монтировать некоторые каталоги. И другое отличие заключается в том, что вы можете подключить каталог хоста к контейнеру с помощью-v
объем используется в
Dockerfileчтобы открыть том, который будет использоваться другими контейнерами. Например, создатьDockerfileкак:от ubuntu: 14.04
RUN mkdir /myvol RUN echo "hello world" > /myvol/greeting VOLUME /myvolпостроить изображения:
$ docker build -t testing_volume .запустите контейнер, скажем container1:
$ docker run -it <image-id of above image> bashтеперь запустите другой контейнер с томами-от опции as (скажем-container2)
$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bashвы получите все данные из container1
/myvolкаталог в container2 в том же месте.
-vопция задается во время выполнения контейнера, который используется для монтирования каталога контейнера на хосте. Он прост в использовании, просто обеспечить-vвариант с аргументом как<host-path>:<container-path>. Вся команда может быть как$ docker run -v <host-path>:<container-path> <image-id>
Это из самой документации Docker, может быть полезно, просто и просто:
"каталог хоста по своей природе зависит от хоста. По этой причине вы не можете подключить каталог хоста из Dockerfile, инструкция VOLUME не поддерживает передачу host-dir, потому что встроенные образы должны быть переносимыми. Каталог хоста будет доступен не на всех потенциальных хостах.".