Как объемы контейнеров Docker работают даже тогда, когда они не работают?

Возьмите только типичные данные только для контейнера Docker:

FROM stackbrew/busybox:latest

RUN mkdir /data
VOLUME /data

Теперь я видел много из них, которые выполняются следующим образом:

docker run -name my-data data true

Команда true завершается, как только она запускается, и контейнер тоже. Но удивительно, что он продолжает обслуживать том, когда вы соединяете его с другим контейнером через --volumes-from my-data.

Мой вопрос: как это работает? Как остановленный контейнер все еще разрешает доступ в нем томам?

Ответы

Ответ 1

Объемы в докерах не являются предметом высшего уровня. Они являются "просто" частью метаданных контейнера.

Когда у вас есть VOLUME в вашем файле докеров или запустите контейнер с -v, Docker создаст каталог в /var/lib/docker/volumes * со случайным идентификатором (это тот же самый процесс, что и создание образа с commit кроме пустого) и добавьте этот случайный идентификатор в метаданные контейнера.

Когда контейнер запустится, Docker установит привязку каталога /var/lib/docker/volumes/ * в данном месте для этого тома.

Когда вы используете volumes-from, Docker будет просто искать идентификатор тома и местоположение из другого контейнера, запускать или нет и монтировать привязку каталога в заданном расположении.

Объемы не связаны с временем выполнения, это только каталоги, которые монтируются.

* В более новых версиях Docker теперь использует драйвер vfs для хранения, а /var/lib/docker/volumes/ используется только для метаданных, таких как размер, время создания и т.д. Фактические данные хранятся в /var/lib/docker/vfs/dir/<volume id>