Перейти к содержанию

Volume

Описание

Volume - способ хранения данных в Docker.

Используется для постоянного хранения данных которые нужно сохранить.

Важно

Контейнеры не хранят данные сами по себе. Все что в них будет создано (логи, конфигурационные файлы, базы данных и т.д.) умрет вместе с самим контейнером.

Виды volume

Существует несколько вариантов хранения данных внутри Docker: - Монтирование каталога с хоста (bind mount) - Volume

  • Файл или каталог с хоста просто монтируется в контейнер.
  • Используется, когда нужно пробросить в контейнер конфигурационные файлы с хоста.
  • Используется при тестировании, не в production
  • Пример:
        docker run -v $(pwd):/app alpine
        $(pwd) -> текущая папка на хосте
        /app   -> папка в контейнере
    

Как выглядит в docker-compose:

services:
    app:
        volumes:
          - ./app:/app

  • Данные хранятся не на хосте, а в самом docker volume.
  • Позволяет хранить данные внутри Docker volume.
  • Используется в production, вместо bind mount
  • Пример:
        docker volume create my_data
        docker run -v my_data:/data alpine
        my_data    -> volume Docker
        /data      -> путь внутри контейнера
    

Как выглядит в docker-compose:

services:
    app:
        volumes:
        - my_data:/data
volumes:
    my_data:


Управление volume

Для создания volume используется команда:

docker volume create <my_data>
<my_data> - название volume

Для удаления volume используется команда:

Предупреждение

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

docker volume rm <my_data>
<my_data> - название volume

Для просмотра созданных volume используется команда:

docker volume ls

Для просмотра информации о volume используется команда:

docker volume inspect <my_data>
<my_data> - название volume

Как добавить данные с хоста в volume

  1. создать volume
  2. запустить "тестовый" контейнер с подключенным volume
  3. скопировать/перенести данные в volume
  4. остановить и удалить "тестовый" контейнер
  5. запустить "реальный" контейнер с подключенным volume

Пример:

# создать volume с названием my_data
docker volume create my_data
# создаем контейнер (любой) в который монтируем volume и bind name и копируем файл index.html с хоста в volume
docker run --rm -v site_data:/site -v $(pwd)/site:/host alpine cp /host/index.html /site

# остановить и удалить "тестовый" контейнер
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

# запустить "реальный" контейнер с подключенным volume
docker run -v my_data:/data alpine