Поиск по сайту:

Что такое тома Docker и как их использовать?


По умолчанию контейнеры Docker не имеют состояния. Данные, хранящиеся в контейнере, являются эфемерными и будут удалены при завершении работы контейнера. Очевидно, что это не идеально для многих приложений, поэтому Docker предоставляет несколько способов работы с состоянием.

Что такое объемы?

Самый простой способ сделать данные Docker постоянными — привязать монтирование, которое буквально привязывает расположение на диске хоста к расположению на диске контейнера. Они просты в создании и использовании, но немного неудобны, так как вам нужно настроить каталоги и управлять ими самостоятельно.

Тома похожи на виртуальные жесткие диски, которыми управляет Docker. Docker хранит их на диске (обычно в /var/lib/docker/volumes/) и дает им легко запоминающееся одно имя, а не путь к каталогу. Их легко создавать и удалять с помощью интерфейса командной строки Docker.

У них есть несколько других преимуществ, помимо управления Docker. Они работают как с контейнерами Linux, так и с Windows, их можно более безопасно использовать между несколькими контейнерами, а драйверы томов позволяют облачным провайдерам предоставлять удаленный хостинг для базовых данных. В целом, тома проще в использовании, чем привязки, и Docker рекомендует их для управления состоянием.

Конечно, вы должны подумать, действительно ли вам нужно, чтобы данные Docker хранились на сервере. Для многих приложений достаточно использовать внешнее удаленное хранилище данных, такое как Amazon S3 или внешнюю базу данных, чтобы хранить используемые ими данные, не привязывая их к внешнему серверу.

Как вы их используете?

Вы можете создать новый том из командной строки с помощью следующей команды:

docker volume create nginx-config

А затем, когда вы собираетесь запускать контейнер Docker, свяжите его с целью в контейнере с помощью флага --mount :

docker run -d 
--name devtest 
--mount source=nginx-config,target=/etc/nginx 
nginx:latest

Если вы запустите docker inspect , вы увидите том, указанный в разделе Mounts .

Если вы используете Docker Compose, настройка также проста. Просто добавьте запись volumes для каждой имеющейся у вас службы контейнеров, а затем сопоставьте имя тома с местоположением в гостевой системе. Вам также потребуется предоставить список томов в ключе верхнего уровня volumes для предоставления Compose.

version: "3.0"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - nginx-config:/etc/nginx/
volumes:
  nginx-config:

Это автоматически создаст том для этого Compose. Если вы хотите использовать готовый том вне Compose, укажите external: true в конфигурации тома:

volumes:
  cms-content:
    external: true

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

version: "3.0"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - /docker/nginx-config/:/etc/nginx/

Вы можете прочитать полную документацию Docker по использованию томов с Compose, если ваш вариант использования требует чего-то более конкретного, чем это.

Перенос томов Docker

Тома Docker — это просто папки, созданные автоматически и сохраненные в /var/lib/docker/volumes/, причем каждый том хранится в ./volumename/_data/. Для резервного копирования и восстановления вы можете просто сделать резервную копию этих томов напрямую.

Если вместо этого вы хотите использовать Docker CLI, они, к сожалению, не предоставляют простого способа сделать это. Для резервного копирования томов контейнера вам потребуется имя контейнера, а также место монтирования, в котором хранятся данные.

Это можно сделать с помощью хака: вам нужно запустить команду в новом контейнере Docker, связать текущий каталог оболочки, смонтировать том в этот контейнер, а затем tar каталог в резервную копию. В итоге вы получите backup.tar тома:

docker run --rm --volumes-from containername -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /mountlocation

Затем аналогичным образом вы можете извлечь архив в целевой каталог:

docker run --rm --volumes-from containername -v $(pwd):/backup ubuntu bash -c "cd /mountlocation && tar xvf /backup/backup.tar --strip 1"

Это все же лучше, чем знать местоположение хоста, поэтому вы можете автоматизировать это, если хотите.