如何避免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
相关产品推荐
相关产品推荐

