Когда контейнер запускается, он использует файлы и конфигурацию, предоставляемые образом. Каждый контейнер может создавать, модифицировать и удалять свои файлы, и это никак не влияет на любые другие контейнеры. Когда контейнер удаляется, то эти изменения файлов также удаляются.
Хотя эта базовая особенность контейнеров очень полезна, она создает трудности, когда вы хотите сохранить измененные данные. Например, если вы перезапустите контейнер базы данных, то можете не захотеть, чтобы база данных осталась пустой. Итак, как можно сохранить файлы контейнера?
[Container volumes]
Volume (том) это механизм хранилища, который предоставляет возможность сохранять данные отдельного контейнера за пределами его жизненного цикла. Это можно представить себе как ярлычок или символическая ссылка на внешнее хранилище, через которые есть доступ к внешнему хранилищу из контейнера.
В качестве примера создадим volume с именем log-data:
$ docker volume create log-data
Когде следующая команда запускает контейнер, volume будет смонтирован (или присоединен) в контайнер в каталог /logs:
$ docker run -d -p 80:80 -v log-data:/logs docker/welcome-to-docker
Если volume с именем log-data не существует, то Docker автоматически его создаст.
Когда контейнер запускается, все файлы, которые он записывает в папку /logs, будут сохраняться в этот volume, находящийся вне контейнера. Если вы удалите контейнер, и запустите новый контейнер с тем же volume, то файлы все еще будут находиться в том же месте.
Обмен файлами с помощью volume. Вы можете присоединить один и тот же volume к нескольким контейнерам, чтобы сделать файлы общими для этих контейнеров. Это может оказаться полезным для таких сценариев, как аггрегация лога, организация конвейеров данных, или другие управляемые событиями приложения.
Управление Volume. У томов свой собственный жизненный цикл, независимый от контейнеров (в том смысле, что том и его содержимое может сохраняться при создании и удалении контейнеров, подключенным к тому). Если том сохраняется долго, то в течение его жизни его размер может значительно увеличиться, в зависимости от типа данных, хранящихся в томе, и от его приложения. Следующие команды помогают управлять томами:
Команда |
Описание |
docker volume ls |
Выведет список всех томов. |
docker volume rm < volume-name-or-id> |
Удалит том, указанный по имени или по ID (команда сработает только в том случае, если том не подсоединен к какому-либо контейнеру). |
docker volume prune |
Удалит все не используемые (не подключенные) тома. |
[Практический пример]
По следующему пошаговому руководству можно научиться создавать и использовать тома, чтобы сохранить в томе данные, созданными контейнером Postgres. Когда база данных запущена, она сохраняет файлы в директории /var/lib/postgresql/data. Путем подключения в неё тома, вы сможете перезапускать контейнер несколько раз, сохраняя накопленные в базе данные.
Использование томов
1. Загрузите и установите Docker Desktop [4].
2. Создайте и запустите контейнер с именем db, используя образ Postgres, следующей командой:
$ docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql/data postgres
Эта команда запустит в фоновом режиме сервер базы данных, сконфигурирует доступ к базе данных по паролю, и подсоединит том к директории PostgreSQL, где будут постоянно находиться файлы базы данных.
3. Подключитесь к базе данных следующей командой:
$ docker exec -ti db psql -U postgres
4. В командной строке PostgreSQL запустите следующее, чтобы создать таблицу в базе данных, и вставить в неё 2 записи:
CREATE TABLE tasks (
id SERIAL PRIMARY KEY,
description VARCHAR(100)
);
INSERT INTO tasks (description) VALUES ('Finish work'), ('Have fun');
5. Проверьте, что данные попали в базу, запустив следующее в командной строке PostgreSQL:
Вы должны получить следующий вывод:
id | description
----+-------------
1 | Finish work
2 | Have fun
(2 rows)
6. Выйдите из шелла PostgreSQL с помощью следующей команды:
7. Остановите и удалите контейнер базы данных. Помните, что даже когда контейнер был удален, данные тома, с которыми он работал, остаются целыми на компьютере хоста в томе postgres_data.
$ docker stop db
$ docker rm db
8. Запустите новый контейнер new-db, присоединив к нему тот же самый том, где должны были сохраниться данные базы:
$ docker run --name=new-db -d -v postgres_data:/var/lib/postgresql/data postgres
Вы возможно заметили, что опущена переменная окружения POSTGRES_PASSWORD, которая указывалась на шаге 2 при создании и запуске контейнера db. Причина в том, что эта переменная используется только при загрузке новой базы данных.
9. Проверьте, что в базе данных все еще остаются записи, запуском следующей команды:
$ docker exec -ti new-db psql -U postgres -c "SELECT * FROM tasks"
Просмотр содержимого тома
Docker Desktop Dashboard предоставляет возможность как просмотреть содержимое любого тома, так и возможности экспортировать, импортировать и клонировать тома.
1. Откройте Docker Desktop Dashboard, и перейдите в раздел списка томов Volumes. Здесь вы должны увидеть ранее созданный том postgres_data.
2. Выберите имя тома postgres_data.
3. Закладка Data покажет содержимое выбранного тома, и предоставляет возможность навигации по его файлам. Двойным кликом на файле вы можете увидеть его содержимое, и можете внести изменения.
4. Правым кликом на любом файле вы можете сохранить его или удалить.
Удаление томов
Перед удалением тома необходимо убедиться, что он не присоединен ни к одному из контейнеров. Если вы не удалили предыдущий контейнер, то сделайте это следующей командой (флаг -f предварительно остановит контейнер перед его удалением):
Для удаления томов существует несколько методов, включая следующие:
• Выбор опции Delete Volume на томе в Docker Desktop Dashboard.
• Использование команды docker volume rm:
$ docker volume rm postgres_data
• Использование команды docker volume prune, которая удалит все не используемые тома:
[Дополнительные ресурсы]
Следуюшие ресурсы помогут вам узнать больше про тома:
Manage data in Docker Volumes Volume mounts
[Ссылки]
1. Persisting container data site:docs.docker.com. 2. Docker Desktop: обмен файлами между Windows и контейнерами Linux. 3. Шаринг локальных файлов хоста для контейнеров. 4. Установка Docker Desktop на Windows. |