我从Docker开始,我需要创建一个包含SQL Server和我自己的数据库的图像,以便稍后在多容器堆栈中使用。
我的主机是Windows 10 Pro工作站,但我将为所有这些层使用Linux容器。所以,首先我要创建一个从microsoft/mssql-server-linux:2017-latest
派生的图像,其中包含我自己的数据库。
我正在遵循https://docs.microsoft.com/en-us/sql/linux/tutorial-restore-backup-in-sql-server-container中列出的步骤,即:
1.打开一个提升的Powershell提示并执行:
docker pull microsoft/mssql-server-linux:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=mypwdhere" --name "sql1" -p 1401:1433 -v sql1data:/var/opt/mssql -d microsoft/mssql-server-linux:2017-latest
我现在可以确保容器已启动docker ps -a
。
2.将备份文件复制到容器中:
docker cp mydatabase.bak sql1:/home
3.我可以使用此命令获取要恢复的文件的逻辑名称:
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "RESTORE FILELISTONLY FROM DISK='/home/mydatabase.bak'"
4.once我得到这些名字,我运行恢复命令:
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "RESTORE DATABASE [mydatabase] FROM DISK='/home/mydatabase.bak' WITH MOVE 'mydatabase' TO '/var/opt/mssql/data/mydatabase.mdf', MOVE 'mydatabase_log' TO '/var/opt/mssql/data/mydatabase.ldf'"
恢复命令成功。
5.最后,我删除了bak文件:
docker exec -it sql1 rm /home/mydatabase.bak
要检查一切是否正常,我可以使用以下命令列出容器中的数据库:
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "SELECT Name FROM sys.Databases"
当我执行此操作时,我可以看到列出了我的数据库。
6.I从容器中创建一个图像:
docker commit sql1 mydatabase-sql
我可以在像
这样的容器中运行此图像docker run --name mydb-sql -p 1401:1433 mydatabase-sql
现在服务器侦听127.0.0.1(localhost)端口1401.我可以使用:localhost,1401
成功登录SSMS;用户= sa
;密码= mypwdhere
。
问题是连接后我看不到我的数据库。我只能看到像master
这样的系统数据库,而不是其他任何东西。如果我尝试直接从容器执行查询,如下所示:
docker exec -it mydb-sql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "USE [mydatabase]; SELECT COUNT(*) FROM Document"
我收到错误,告诉我该数据库不存在。实际上,如果我尝试使用此命令列出数据库:
docker exec -it mydb-sql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "SELECT Name FROM sys.Databases"
我只获得master
,tempdb
,model
,msdb
。我在这里缺少什么?
答案 0 :(得分:0)
在步骤1
中,您正在使用以下内容在容器中装入卷
... -v sql1data:/ var / opt / mssql
因此,任何db操作都不是容器文件系统的一部分,因此在以后运行docker commit
时不会包含这些操作。
在单独的Docker volume中拥有运行时数据(如数据库)是最佳做法,但是省略挂载应该会给出预期的结果,但我建议在提交最终映像之前停止容器。
此外,除非你只是在玩游戏,否则请查看Dockerfile如何正确构建Docker镜像。由于缺乏构建可重复性,建议不要commit
。
答案 1 :(得分:0)
另一个选项是Microsoft Windows Server核心1709包括网络SMB文件共享支持,支持远程安装到数据库。您需要为每个容器构建运行Dockerfile(如上所述,给定的挂载点不会在映像中保留)。