docker монтирование томов на хосте


я успешно смог обмениваться папками между контейнером docker с томами с помощью

docker run -v /host/path:/container/path ...

но мой вопрос в том, какая разница между этим и использованием VOLUME команда в Dockerfile

VOLUME /path

Я использую изображение, которое имеет VOLUME команда, и я хотел бы знать, как поделиться им с моим хозяином. Я сделал это с помощью -v команда выше, но я не знал, нужны ли мне оба -v и VOLUME.

5 99

5 ответов:

The VOLUME команда смонтирует каталог внутри вашего контейнера и сохранит все файлы, созданные или отредактированные внутри этого каталога на вашем диске хостов вне структуры файла контейнера, минуя файловую систему объединения.

идея заключается в том, что ваши Тома могут быть разделены между вашими контейнерами docker, и они будут оставаться вокруг, пока есть контейнер (запущенный или остановленный), который ссылается на них.

вы можете иметь другие контейнеры гора существующие Тома (эффективно разделяя их между контейнерами) с помощью при запуске контейнера.

принципиальная разница между VOLUME и -v это: -v будет монтировать существующие файлы из вашей операционной системы внутри вашего контейнера docker и VOLUME будет создать новый, пустой объем на вашем Хосте и установите его внутри контейнера.

пример:

  1. у вас есть Dockerfile, который определяет а VOLUME /var/lib/mysql.
  2. вы создаете изображение docker и помечаете его some-volume
  3. вы запускаете контейнер

и

  1. у вас есть еще один образ докера, который вы хотите использовать этот том
  2. вы запускаете контейнер docker со следующим: docker run --volumes-from some-volume docker-image-name:tag
  3. теперь у вас есть контейнер 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, потому что встроенные образы должны быть переносимыми. Каталог хоста будет доступен не на всех потенциальных хостах.".