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