- Что такое тома Docker
- Шаг 1: Убедитесь, что Docker установлен
- Шаг 2: Создание тома
- Шаг 3: Запуск контейнера с томом
- Шаг 4: Запустим другой контейнер с тем же томом
- Шаг 5: Проверим данные тома во втором контейнере
- Шаг 6: Удалим оба контейнера
- Шаг 7: Создадим новый контейнер с подключенным томом
- Шаг 8: Уничтожение контейнера и тома
- Шаг 9: Создание контейнера с томом, доступным только для чтения
- Шаг 10: Убедитесь, что том доступен только для чтения
Что такое тома 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, как показано ниже.
Он предоставит нам фактическое местоположение тома 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, подключившись к контейнеру, как показано ниже.
$ 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, доступны для всех контейнеров, к которым прикреплен этот том.
Шаг 6: Удалим оба контейнера
После проверки данных в обоих контейнерах вы можете уничтожить контейнеры, остановив и удалив их, как показано ниже.
Шаг 7: Создадим новый контейнер с подключенным томом
Несмотря на то, что контейнеры, использовавшие «datavol», были уничтожены, том docker по-прежнему сохраняется, и мы можем проверить это, создав другой контейнер и прикрепив к нему том, как показано ниже.
$ docker run -d \ --name devtest3 \ -- mount source =datavol,target= /app \ nginx:latest 5c7d04ae21df383d540cd59643467d922ff88a684c95414ded07cccb9fc356c8 |
Мы можем проверить постоянство монтирования тома, убедившись, что том все еще существует с созданными данными.
Шаг 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 |
см. также:
- 🐳 Поиск базового образа образа Docker
- 🐳 Как очистить логи контейнера Docker
- 🐳 Самоучитель по логированию контейнеров Docker для начинающих
- 🐳 Монтируем безопасные секреты во временя сборки с помощью Docker и Docker Compose