Docker Volume Backup & Restore
Tags: docker, volumes
Published: 2022-10-04 14:28:14

# Backup
Перейти в папку, в которой мы ожидаем появления архива и выполнить следующую команду
```
docker run --rm --volume [имя volume, который мы хотим архивировать]:/data --volume $(pwd):/backup ubuntu tar cvf /backup/backup.tar /data
```
### Пояснение
1) Запустить контейнер
`docker run `
2) **image** будет удалён после запуска контейнера
`--rm` 
3) монтировать нужный нам **volume** в папку **data** внутри создаваемого контейнера
имя этой папки может быть любым
`--volume [имя volume, который мы хотим архивировать]:/data`
4) связать текущую папку **$(pwd)** с папкой **backup** внутри создаваемого контейнера
текущая папка - это место, где мы ожидаем появления архива **backup.tar**
имя папки **backup** может быть любым
то есть данные из папки **backup**, расположенной внутри контейнера будут появляться в текущей папке
`--volume $(pwd):/backup`
5) имя **image** контейнера, который создаётся
не обязательно использовать именно **ubuntu**, это может быть любой образ
нам всего лишь нужно скопировать данные из существующего **volume**, где располагаются наши данные в новый **volume**
`ubuntu`
6) архивировать то, что находится в папке **data** в архив c именем **backup.tar**
архив **backup.tar** появляется в папке **backup** внутри контейнера, и, так как мы связали в команде 4 папку **backup** внутри контейнера с текущей директорией, файл **backup.tar** появится в текущей директории
`tar cvf /backup/backup.tar /data`
	
# Restore
Перейти в папку, в которой находится файл **.tar** с резервной копией базы данных и выполнить следующую команду
```
docker run --rm --volume some_docker_project-backup:/extracted_backup --volume $(pwd):/data ubuntu tar xvf /data/backup.tar -C /extracted_backup --strip 1
```
### Пояснение
1) Запустить контейнер
`docker run`
2) **image** будет удалён после запуска контейнера
`--rm` 
3) связать новый **volume** **some_docker_project-backup** с папкой **extracted_backup** внутри контейнера
новый **volume** - это тот, который потом планируется использовать в качестве источника данных в файле **docker-compose**. В файле **docker-compose** имя **volume** указывается без префикса [имя проекта] (в этом примере это **some_docker_project**), а имя проекта добавляется в процессе выполнения команды **docker-compose up** (для смены имени проекта по-умолчанию нужно использовать параметр **--project-name**)
поэтому здесь имя нового volume включает в себя префикс **some_docker_project** - это как раз имя проекта **docker-compose**
папка **extracted_backup** - это папка внутри контейнера, имя папки может быть любым
`--volume some_docker_project-backup:/extracted_backup`
4) связать текущую папку с папкой **data** внутри контейнера.
текущая папка - это та папка, в которой находится архив **.tar** с резервной копией базы данных
`--volume $(pwd):/data`
5) имя запускаемого образа
не обязательно использовать именно **ubuntu**, это может быть любой образ
`ubuntu`
6) разархивировать файл **.tar** в папку **extracted_backup** внутри контейнера, которую ранее мы связывали с новым **volume**. В результате появится новый **volume** с данными из архива, которые были извлечены в папку **extracted_backup** внутри контейнера
`tar xvf /data/backup.tar -C /extracted_backup --strip 1`