我应该如何备份和恢复 docker 个命名卷
How should I backup & restore docker named volumes
我对 docker 组合文件中命名卷的功能有点困惑,特别是当涉及到 backup/restore 我的应用程序时。
我实际上正在测试这个 dockercompose 文件:
version: '2'
services:
django:
build:
context: "{{ build_dir }}/docker/django"
depends_on:
- db
environment:
[...]
volumes:
- code:/data/code
- www:/var/www
- conf:/data/conf
networks:
- front
- db
expose:
- "8080"
entrypoint: "/init"
db:
build:
context: "{{ build_dir }}/docker/postgres"
environment:
[...]
volumes:
- data:/var/lib/postgresql/data
networks:
- db
volumes:
data:
www:
code:
conf:
networks:
front:
external:
name: "proxy_nw"
如文档所述,我尝试使用命名卷而不是仅数据容器。但是我应该如何备份我的数据呢?
使用纯数据容器我会做一个 docker run --rm --volume-from DOC backup_container save
,这真的很容易。
现在我读 我应该使用像 docker run --rm --volume data --volume www --volume code --volume conf backup_container save
这样的东西。这不是那么简单,因为我有许多具有不同类型和名称的卷的应用程序,所以这意味着我保存数据的命令对于每个应用程序都必须不同。它使自动化过程复杂化。
编辑: 其实这个语法
docker run --volume data --volume www container_image my_command
不正确。
它需要容器内的挂载点,所以它会是
docker run --volume data:/somewhere --volume www:/somewhereelse container_image my_command
。
因此,与备份容器一起使用更加复杂。
那么,在这种情况下,最佳做法是什么? 我应该为我的所有容器只使用一个命名卷吗?
实际上应该按照官方文档中写的方式来完成。数据卷容器将其数据存储在 "virtual root" 中,因此您应该使用下一个命令进行备份:
docker run --rm \
--volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] \
--volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \
ubuntu \
tar cvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar /[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA]
其中:
- --rm表示为这个运行命令创建的镜像会被清理
- DOCKER_COMPOSE_PREFIX默认是你的项目目录名
- VOLUME_NAME 是 compose 文件中的数据卷容器名称
- TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA是挂载卷数据的目录
- TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE是一个虚拟映射到你当前目录的目录,备份将放在那里
- BACKUP_FILENAME - 备份文件名(在当前目录下找到)
- ubuntu - 您可以使用 tar 将图像类型更改为另一个容器 :)
将数据取回卷(恢复):
docker run --rm \
--volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] \
--volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \
ubuntu \
tar xvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar -C /[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] --strip 1
其中:
- TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP 是提取的文件将被复制到的目录(这与卷链接,因此将写入它)
- -C - 告诉tar在哪里提取内容
- --strip 1 - 删除前导路径元素(例如,如果备份内容位于 /temp 文件夹或类似文件夹中,则删除父目录)
我终于改变了我的做法。我解析容器的体积以寻找挂载点,并将所有内容备份到 tar 中的单独文件夹中。
所以我没有使用容器来执行此操作,而是使用外部脚本。我不知道这是否是更好的方法,但效果很好。
这是我如何将 mongo 卷数据备份和恢复为 docker 映像的示例。
# let a9c25f42ccca be mongo container id
docker stop a9c25f42ccca
# create a temp container with volume taken from mongo
# make a local tar archive inside it
docker run --name temp_backup --volumes-from a9c25f42ccca ubuntu tar cvf /mongo_backup.tar /data/db
docker start a9c25f42ccca
# make an image and remove temp container
docker commit temp_backup my_mongo_backup
docker rm temp_backup
# push image with backup to remote registry if needed
docker push my_mongo_backup
正在恢复。
#pull image if needed
docker pull my_mongo_backup
docker stop a9c25f42ccca
# run transient container out from image with backup
# take volume from mongo
# clear any existing data
# restore data from tar arhcive
docker run --rm --volumes-from a9c25f42ccca my_mongo_backup bash -c "rm -rf /data/db/* && tar xvf /mongo_backup.tar -C /data --strip 1"
docker start a9c25f42ccca
基于 。
我在这里做了一个简单的工具:
docker_named_volume_backup
第一个 运行 命令 docker volume ls
列出您要备份的命名卷。
然后备份
#sudo backup_docker_volume.sh <volumn_name> <tar_file>
sudo bash ./backup_docker_volume.sh codimd_database-data backup1.tar
恢复
#sudo restore_docker_volume.sh <volumn_name> <tar_file>
sudo bash ./restore_docker_volume.sh codimd_database-data backup1.tar
我对 docker 组合文件中命名卷的功能有点困惑,特别是当涉及到 backup/restore 我的应用程序时。
我实际上正在测试这个 dockercompose 文件:
version: '2'
services:
django:
build:
context: "{{ build_dir }}/docker/django"
depends_on:
- db
environment:
[...]
volumes:
- code:/data/code
- www:/var/www
- conf:/data/conf
networks:
- front
- db
expose:
- "8080"
entrypoint: "/init"
db:
build:
context: "{{ build_dir }}/docker/postgres"
environment:
[...]
volumes:
- data:/var/lib/postgresql/data
networks:
- db
volumes:
data:
www:
code:
conf:
networks:
front:
external:
name: "proxy_nw"
如文档所述,我尝试使用命名卷而不是仅数据容器。但是我应该如何备份我的数据呢?
使用纯数据容器我会做一个 docker run --rm --volume-from DOC backup_container save
,这真的很容易。
现在我读 docker run --rm --volume data --volume www --volume code --volume conf backup_container save
这样的东西。这不是那么简单,因为我有许多具有不同类型和名称的卷的应用程序,所以这意味着我保存数据的命令对于每个应用程序都必须不同。它使自动化过程复杂化。
编辑: 其实这个语法
docker run --volume data --volume www container_image my_command
不正确。
它需要容器内的挂载点,所以它会是
docker run --volume data:/somewhere --volume www:/somewhereelse container_image my_command
。
因此,与备份容器一起使用更加复杂。
那么,在这种情况下,最佳做法是什么? 我应该为我的所有容器只使用一个命名卷吗?
实际上应该按照官方文档中写的方式来完成。数据卷容器将其数据存储在 "virtual root" 中,因此您应该使用下一个命令进行备份:
docker run --rm \
--volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] \
--volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \
ubuntu \
tar cvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar /[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA]
其中:
- --rm表示为这个运行命令创建的镜像会被清理
- DOCKER_COMPOSE_PREFIX默认是你的项目目录名
- VOLUME_NAME 是 compose 文件中的数据卷容器名称
- TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA是挂载卷数据的目录
- TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE是一个虚拟映射到你当前目录的目录,备份将放在那里
- BACKUP_FILENAME - 备份文件名(在当前目录下找到)
- ubuntu - 您可以使用 tar 将图像类型更改为另一个容器 :)
将数据取回卷(恢复):
docker run --rm \
--volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] \
--volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \
ubuntu \
tar xvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar -C /[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] --strip 1
其中:
- TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP 是提取的文件将被复制到的目录(这与卷链接,因此将写入它)
- -C - 告诉tar在哪里提取内容
- --strip 1 - 删除前导路径元素(例如,如果备份内容位于 /temp 文件夹或类似文件夹中,则删除父目录)
我终于改变了我的做法。我解析容器的体积以寻找挂载点,并将所有内容备份到 tar 中的单独文件夹中。
所以我没有使用容器来执行此操作,而是使用外部脚本。我不知道这是否是更好的方法,但效果很好。
这是我如何将 mongo 卷数据备份和恢复为 docker 映像的示例。
# let a9c25f42ccca be mongo container id
docker stop a9c25f42ccca
# create a temp container with volume taken from mongo
# make a local tar archive inside it
docker run --name temp_backup --volumes-from a9c25f42ccca ubuntu tar cvf /mongo_backup.tar /data/db
docker start a9c25f42ccca
# make an image and remove temp container
docker commit temp_backup my_mongo_backup
docker rm temp_backup
# push image with backup to remote registry if needed
docker push my_mongo_backup
正在恢复。
#pull image if needed
docker pull my_mongo_backup
docker stop a9c25f42ccca
# run transient container out from image with backup
# take volume from mongo
# clear any existing data
# restore data from tar arhcive
docker run --rm --volumes-from a9c25f42ccca my_mongo_backup bash -c "rm -rf /data/db/* && tar xvf /mongo_backup.tar -C /data --strip 1"
docker start a9c25f42ccca
基于
第一个 运行 命令 docker volume ls
列出您要备份的命名卷。
然后备份
#sudo backup_docker_volume.sh <volumn_name> <tar_file>
sudo bash ./backup_docker_volume.sh codimd_database-data backup1.tar
恢复
#sudo restore_docker_volume.sh <volumn_name> <tar_file>
sudo bash ./restore_docker_volume.sh codimd_database-data backup1.tar