如何使用Docker备份、重命名并恢复数据卷(Compose场景)
问题场景
我在Docker Compose中通过volumes_from从数据容器加载SQL Server数据,配置如下:
mssql-server-linux: image: mssql-server-linux:2017-latest depends_on: - mssql-server-linux-data volumes_from: - mssql-server-linux-data mssql-server-linux-data: image: mssql-server-linux-data-keva:latest entrypoint: /bin/sh volumes: - /var/opt/mssql
当前数据库使用匿名数据卷存储:
$ docker volume ls DRIVER VOLUME NAME local e0368e9ae230de6578bb18a3a70823d93ecc4acab7905f96380aff4689024c25
我希望改用命名镜像和命名数据卷实现数据库的备份与恢复,同时之前尝试用tar备份数据卷失败,执行命令如下:
$ docker run --rm --volumes-from emma_mssql-server-linux_1 -v /c/temp:/backup ubuntu tar cvf /backup/backup.tar /var/opt/mssql tar: Cannot connect to C: resolve failed
一、修复tar备份失败问题
错误源于Windows路径解析逻辑:Linux容器会把/c/temp误判为要连接主机C,而非Windows的C盘路径。按以下方式修改命令:
针对Windows Docker Desktop(WSL2后端)
使用Docker识别的标准Windows路径挂载:
docker run --rm --volumes-from emma_mssql-server-linux_1 -v /run/desktop/mnt/host/c/temp:/backup ubuntu tar cvpf /backup/backup.tar /var/opt/mssql
若使用WSL终端,直接用WSL路径格式:
docker run --rm --volumes-from emma_mssql-server-linux_1 -v /mnt/c/temp:/backup ubuntu tar cvpf /backup/backup.tar /var/opt/mssql
关键注意点
- 加
p参数保留文件权限(SQL Server数据目录依赖正确权限) - 确保Docker Desktop已开启C盘共享(设置>资源>文件共享)
二、迁移到命名数据卷(替代匿名卷)
匿名卷不利于管理,先将现有数据迁移到命名卷:
- 创建命名数据卷
docker volume create mssql-data
- 把匿名卷数据复制到命名卷(替换命令中的匿名卷ID为你的实际值)
docker run --rm -v e0368e9ae230de6578bb18a3a70823d93ecc4acab7905f96380aff4689024c25:/source -v mssql-data:/target ubuntu cp -a /source/. /target/
- 修改Docker Compose配置,直接挂载命名卷(
volumes_from已被Docker弃用,推荐此方式)
mssql-server-linux: image: mssql-server-linux:2017-latest volumes: - mssql-data:/var/opt/mssql volumes: mssql-data: external: false
三、用命名镜像备份数据卷
基于命名卷创建可复用的备份镜像,方便迁移或恢复:
方式1:通过Dockerfile构建
- 创建
Dockerfile.mssql-backup文件:
FROM alpine:latest VOLUME /var/opt/mssql COPY --from=ubuntu:latest /bin/cp /bin/cp CMD ["cp", "-a", "/var/opt/mssql/.", "/backup/"]
- 从命名卷提取数据并构建镜像:
docker run --rm -v mssql-data:/var/opt/mssql -v $(pwd):/backup alpine cp -a /var/opt/mssql/. /backup/mssql-data/ docker build -t mssql-server-linux-backup:latest -f Dockerfile.mssql-backup ./mssql-data/
方式2:直接打包数据卷为镜像
docker run --rm -v mssql-data:/data alpine tar cvf - /data | docker import - mssql-server-linux-backup:latest
四、从备份镜像恢复数据
- 创建用于恢复的新命名卷:
docker volume create mssql-data-restored
- 从备份镜像提取数据到新卷:
docker run --rm -v mssql-data-restored:/target mssql-server-linux-backup:latest sh -c "cp -a /var/opt/mssql/. /target/"
- 修改Docker Compose配置,将数据库容器挂载到
mssql-data-restored卷,启动容器即可验证数据恢复结果。
内容的提问来源于stack exchange,提问作者Tuomas Toivonen
相关产品推荐
相关产品推荐

