You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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盘共享(设置>资源>文件共享)

二、迁移到命名数据卷(替代匿名卷)

匿名卷不利于管理,先将现有数据迁移到命名卷:

  1. 创建命名数据卷
docker volume create mssql-data
  1. 把匿名卷数据复制到命名卷(替换命令中的匿名卷ID为你的实际值)
docker run --rm -v e0368e9ae230de6578bb18a3a70823d93ecc4acab7905f96380aff4689024c25:/source -v mssql-data:/target ubuntu cp -a /source/. /target/
  1. 修改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构建

  1. 创建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/"]
  1. 从命名卷提取数据并构建镜像:
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

四、从备份镜像恢复数据

  1. 创建用于恢复的新命名卷:
docker volume create mssql-data-restored
  1. 从备份镜像提取数据到新卷:
docker run --rm -v mssql-data-restored:/target mssql-server-linux-backup:latest sh -c "cp -a /var/opt/mssql/. /target/"
  1. 修改Docker Compose配置,将数据库容器挂载到mssql-data-restored卷,启动容器即可验证数据恢复结果。

内容的提问来源于stack exchange,提问作者Tuomas Toivonen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:55:17