🐳 Как сохранить данные контейнера с помощью томов docker |

🐳 Как сохранить данные контейнера с помощью томов docker

Мануал

Что такое тома Docker

Тома Docker обеспечивают постоянное хранилище для записываемого слоя контейнера.

Мы можем создать эти тома явно с помощью команды docker volume create или во время создания контейнера или сервиса.

Docker volume – это каталог, расположенный на хосте docker.

Именно этот каталог монтируется, когда мы монтируем том docker в контейнер.

Тома управляются Docker и изолированы от основной функциональности хост-машины.

🐳 Как проверить оставшееся дисковое пространство в файловой системе Docker Overlay

Тома – не лучший выбор, если вам нужно получить доступ к файлам с хоста, так как тома полностью управляются Docker.

В этом случае для доступа к файлам или каталогам как из контейнеров, так и с хоста подойдет Bind mounts.

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

Шаг 1: Убедитесь, что Docker установлен

Убедитесь, что у вас установлен docker engine и вы можете запустить его с правами не rootа.

Шаг 2: Создание тома

Здесь мы воспользуемся docker cli для создания тома с именем «datavol» вручную, как показано ниже.

Это хранилище томов будет создано локально на хост-машине, но управлять им сможет только сам docker.

Обратите внимание, что создаваемый нами том является именованным томом, поскольку мы явно указываем имя «datavol» при его создании.

docker volume create datavol
datavol

Давайте перечислим тома, которые в данный момент доступны на нашем хосте.

docker volume ls
DRIVER VOLUME NAME
local datavol

Чтобы получить подробную информацию о томе, мы можем просмотреть том docker, как показано ниже.

Он предоставит нам фактическое местоположение тома docker, размещенного на хост-машине.

$ docker volume inspect datavol
[
    {
        "CreatedAt": "2025-02-18T18:06:25+05:30",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/datavol/_data",
        "Name": "datavol",
        "Options": null,
        "Scope": "local"
    }
]

Шаг 3: Запуск контейнера с томом

Теперь мы запустим контейнер с помощью тома docker, смонтированного в каталоге /app внутри контейнера, как показано ниже.

docker run -d \
--name devtest \
--mount source=datavol,target=/app \
nginx:latest

Давайте запишем содержимое в смонтированный том docker, подключившись к контейнеру, как показано ниже.

$ docker exec -it devtest sh
# ls -ltr /app
total 0
# echo "Hello datavol!!" > /app/hellovolume.txt
# ls -ltr /app/hellovolume.txt
-rw-r--r--. 1 root root 16 Feb 18 12:40 /app/hellovolume.txt
# cat /app/hellovolume.txt
Hello datavol!!

Шаг 4: Запустим другой контейнер с тем же томом

Теперь, когда у нас уже есть контейнер, прикрепленный к тому docker, и мы записали в него некоторые данные.

Давайте создадим еще один контейнер с тем же томом, как показано ниже.

$ docker run -d \
  --name devtest2 \
  --mount source=datavol,target=/app \
  nginx:latest

Шаг 5: Проверим данные тома во втором контейнере

Поскольку тома docker – это постоянное хранилище.

Данные, хранящиеся в томе docker, доступны для всех контейнеров, к которым прикреплен этот том.

docker exec devtest2 cat /app/hellovolume.txt
Hello datavol!!

Шаг 6: Удалим оба контейнера

После проверки данных в обоих контейнерах вы можете уничтожить контейнеры, остановив и удалив их, как показано ниже.

docker stop devtest devtest2
devtest
devtest2
docker rm devtest devtest2
devtest
devtest2

Шаг 7: Создадим новый контейнер с подключенным томом

Несмотря на то, что контейнеры, использовавшие «datavol», были уничтожены, том docker по-прежнему сохраняется, и мы можем проверить это, создав другой контейнер и прикрепив к нему том, как показано ниже.

$ docker run -d \
  --name devtest3 \
  --mount source=datavol,target=/app \
  nginx:latest
5c7d04ae21df383d540cd59643467d922ff88a684c95414ded07cccb9fc356c8

Мы можем проверить постоянство монтирования тома, убедившись, что том все еще существует с созданными данными.

docker exec devtest3 cat /app/hellovolume.txt
Hello datavol!!

Шаг 8: Уничтожение контейнера и тома

Давайте уничтожим контейнер и том, как показано ниже.

$ docker stop devtest3
devtest3
$ docker rm devtest3
devtest3
$ docker volume rm datavol
datavol

Шаг 9: Создание контейнера с томом, доступным только для чтения

Можно указать опцию монтирования, когда мы монтируем том в контейнер.

Здесь мы собираемся смонтировать том docker в режиме readonly, передав эту опцию, как показано ниже.

$ docker run -d \
  --name devtest3 \
  --mount source=datavol,target=/app,readonly \
  nginx:latest

Шаг 10: Убедитесь, что том доступен только для чтения

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

$ docker exec -it devtest3 sh
# echo "Hello datavolume!!" > /app/hello.txt
sh: 2: cannot create /app/hello.txt: Read-only file system

см. также:

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий