Docker Volumes при обновлении образа

Я новичок в Docker и пытаюсь лучше понять тему Volumes. Вот что я вижу:

  • Тома инициализируются при создании контейнера. Если базовый образ контейнера содержит данные в указанной точке монтирования, эти существующие данные копируются в новый том при инициализации тома. (Обратите внимание, что это не применяется при монтировании каталога хоста.)
  • Объемы данных могут совместно использоваться и повторно использоваться между контейнерами.
  • Изменения в томе данных вносятся напрямую.
  • Изменения в томе данных не будут включены при обновлении изображения.
  • Тома данных сохраняются, даже если сам контейнер удален.
  • Тома данных предназначены для хранения данных независимо от жизненного цикла контейнера. Таким образом, Docker никогда не удаляет тома автоматически при удалении контейнера и не выполняет «сборку мусора», на которые контейнер больше не ссылается.

Что очень ясно, за исключением этого:

  • Изменения в томе данных не будут включены при обновлении изображения.

и я действительно изо всех сил пытаюсь понять это. Может ли кто-нибудь предоставить мне более четкий обзор, возможно, на каком-то базовом примере?

Спасибо!


person net.cat    schedule 29.06.2016    source источник


Ответы (2)


Тома находятся вне файловой системы вашего контейнера. Они монтируются во время выполнения, но данные в них не хранятся в контейнере. Возьмем пример:

j@host $ docker volume create --name my-data

Это создает том (пока нет контейнеров) с именем my-data. Теперь я создаю новый контейнер и монтирую этот том внутри своего контейнера в /inside/data.

j@host $ docker run -it -v my-data:/inside/data --name container1 alpine:3.3 sh

Теперь я нахожусь в своей оболочке внутри своего контейнера, поэтому я создаю новый файл внутри папки /inside/data.

root@container1 $ cd /inside/data && touch my-file

Теперь /inside/data на самом деле не в файловой системе моего контейнера, это том, который находится за пределами контейнера, который только что смонтирован. Если я остановлю свой контейнер и _не подключу этот том обратно, моего файла нет.

root@container1 $ exit
j@host $ docker run -it --name container2 alpine:3.3 sh
root@container2 $ ls /inside/data
ls: /inside/data: No such file or directory
root@container2 $ exit

На самом деле даже папки нет! Потому что в этом месте я ничего не монтировал. Я использую тома, поэтому мои данные не сохраняются в контейнере. Так как мне снова его найти? Что ж, это сохраняется в томе (my-data). Давайте посмотрим на это, установив его в другой контейнер (мне не нужно монтировать его в той же точке, я собираюсь использовать что-то другое).

j@host $ docker run -it -v my-data:/different/folder --name container3 alpine:3.3 sh
root@container3 $ ls /different/folder
my-file
root@container3 $ exit

Хорошо, я могу получить эти данные и смонтировать их в разные контейнеры. Но где на самом деле хранятся данные в томе? Ну, в моей файловой системе хоста. Мы можем проверить, выполнив:

j@host $ docker volume inspect my-data
[
    {
        "Name": "my-data",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/my-data/_data",
        "Labels": {},
        "Scope": "local"
    }
]

Хорошо, он сообщает мне, где на моем хосте находится этот том, давайте посмотрим, что там находится (нам нужен sudo, потому что он принадлежит пользователю root).

j@host $ sudo ls /var/lib/docker/volumes/my-data/_data
my-file

И вот файл!

person johnharris85    schedule 29.06.2016

Я думаю, он пытается сказать, если объем данных изменен другим процессом (он может быть изменен из другого контейнера или другой системы), изменения не будут включены / записаны при создании / обновлении образа докера, что очень очевидно.

person Aldo Suwandi    schedule 29.06.2016