Docker Compose v3拆分SQL Server服务与独立数据镜像的配置方法
问题解答
核心结论
Docker Compose v3版本已官方废弃volumes_from属性,不推荐用该属性实现需求,最优方案为独立数据镜像 + 共享命名卷的拆分方式,完全满足你单独拉取数据镜像、不依赖服务镜像的要求。
具体操作步骤
步骤1:制作专用数据镜像
数据镜像仅用于存储数据,用极小的busybox作为基础镜像,整体体积不到2M,远小于SQL Server的服务镜像。
在当前目录下新建data/Dockerfile,内容如下:
FROM busybox:latest # 声明和SQL Server数据路径一致的挂载点 VOLUME /var/opt/mssql/data # 保持容器后台运行不退出,方便挂载调用 CMD ["tail", "-f", "/dev/null"]
步骤2:修改docker-compose配置
拆分服务为数据容器和SQL Server服务容器两部分,配置如下:
version: '3.4' # 声明全局共享命名卷,用于两个容器之间的数据同步 volumes: sqlserver-data: services: # 数据容器:仅负责数据存储,无服务逻辑 sqlserver-data: build: ./data container_name: MsSqlServer_Data volumes: - sqlserver-data:/var/opt/mssql/data # 服务容器:仅运行SQL Server服务,不存储持久化数据 sqlserver: image: mcr.microsoft.com/mssql/server container_name: MsSqlServer environment: - ACCEPT_EULA=Y - SA_PASSWORD=Password_01 ports: - "1433:1433" volumes: - sqlserver-data:/var/opt/mssql/data depends_on: - sqlserver-data
步骤3:日常使用操作
- 首次启动:执行
docker compose up -d,会自动构建数据镜像、依次启动数据容器和服务容器 - 打包数据镜像:备份前先停止SQL Server服务避免写入损坏,执行
docker stop MsSqlServer,再执行docker commit MsSqlServer_Data sqlserver-data:备份版本号即可生成独立的数据镜像,可直接推送到镜像仓库存储,拉取时仅拉取该数据镜像即可 - 更新服务镜像:直接拉取最新版SQL Server官方镜像,执行
docker compose up -d --no-deps sqlserver重启服务即可,完全不影响数据容器内容
Docker Compose v3下其他可行方案
- 本地绑定挂载+独立备份镜像:保留你原有本地磁盘挂载的逻辑,额外做一个专用备份镜像,定期把本地
/tmp/docker-volumes/db的内容打包为镜像,适合需要直接在本地查看数据文件的场景 - 第三方卷插件:使用local-persist等Docker卷插件,将命名卷和镜像绑定分发,适合多节点集群的大规模部署场景,复杂度相对更高
内容的提问来源于stack exchange,提问作者Jakub Janiš
相关产品推荐
相关产品推荐

