使用SQL Server(Linux)和我自己的数据库创建docker镜像:在容器中找不到数据库

时间:2018-01-06 08:22:44

标签: sql-server docker

我从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"

我只获得mastertempdbmodelmsdb。我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

在步骤1中,您正在使用以下内容在容器中装入卷

  

... -v sql1data:/ var / opt / mssql

因此,任何db操作都不是容器文件系统的一部分,因此在以后运行docker commit时不会包含这些操作。

在单独的Docker volume中拥有运行时数据(如数据库)是最佳做法,但是省略挂载应该会给出预期的结果,但我建议在提交最终映像之前停止容器。

此外,除非你只是在玩游戏,否则请查看Dockerfile如何正确构建Docker镜像。由于缺乏构建可重复性,建议不要commit

答案 1 :(得分:0)

另一个选项是Microsoft Windows Server核心1709包括网络SMB文件共享支持,支持远程安装到数据库。您需要为每个容器构建运行Dockerfile(如上所述,给定的挂载点不会在映像中保留)。