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

如何避免Docker Compose部署的SQL Server容器数据丢失及连接变更问题

嘿,这两个问题我之前折腾SQL Server Windows容器的时候也踩过坑!一个是IP变来变去每次都要重新查,另一个是数据说没就没,太闹心了。别慌,给你两个简单的方案,一次性搞定!

一、解决SQL Server数据丢失问题(持久化数据)

Docker容器默认的存储是临时的,一旦容器被删除或者重建,里面的数据就没了。要保留SQL Server的数据,我们需要用**Docker卷(Volumes)**来把容器里的SQL数据目录映射到Docker管理的持久化存储里。

修改你的docker-compose.yml,添加卷配置:

version: '3.8'
services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2019-latest
    environment:
      SA_PASSWORD: "YourStrong!Passw0rd"  # 记得用符合复杂度的密码
      ACCEPT_EULA: "Y"
      MSSQL_PID: "Express"
    ports:
      - "1433:1433"
    volumes:
      # 用named volume持久化SQL数据,路径对应Windows容器里的SQL数据目录
      - sqlserver-data:C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA
    restart: unless-stopped

# 定义named volume,Docker会自动管理这个存储
volumes:
  sqlserver-data:

注意事项:

  • 确认SQL Server的路径:不同版本的SQL Server,路径里的版本号(比如MSSQL15)可能不同。你可以先启动旧容器,执行docker exec <容器名> dir "C:\Program Files\Microsoft SQL Server"查看具体路径,再修改compose文件。
  • 第一次用这个配置启动前,先执行docker-compose down删除旧容器(如果之前有重要数据请先备份),然后docker-compose up -d启动新容器,之后创建的数据库都会存在sqlserver-data卷里,重启/停止容器都不会丢失。
二、解决容器IP变更问题(不用再查IP)

默认Docker的网桥是动态分配IP的,容器重启后IP大概率会变。有两个更省心的连接方式:

方法1:直接用宿主机端口连接(最方便)

因为你已经在compose里把容器的1433端口映射到了宿主机的1433端口,所以在SQL Operations Studio里连接时,**服务器地址直接填localhost,1433**就行!完全不用管容器的IP是什么,只要容器在运行,就能通过宿主机端口连接。

方法2:给容器分配固定IP(适合容器间通信场景)

如果你的场景需要其他服务或者工具直接访问容器IP,可以在compose里配置自定义网桥,给容器指定固定IP:

version: '3.8'
# 自定义网桥,指定子网
networks:
  sqlnet:
    ipam:
      config:
        - subnet: 172.20.0.0/16
          gateway: 172.20.0.1

services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2019-latest
    environment:
      SA_PASSWORD: "YourStrong!Passw0rd"
      ACCEPT_EULA: "Y"
      MSSQL_PID: "Express"
    ports:
      - "1433:1433"
    volumes:
      - sqlserver-data:C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA
    # 加入自定义网桥,并指定固定IP
    networks:
      sqlnet:
        ipv4_address: 172.20.0.10
    restart: unless-stopped

volumes:
  sqlserver-data:

这样每次启动容器,它的IP都会是172.20.0.10,连接的时候直接用这个IP就行,再也不用查docker inspect了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:59:27