Docker SQL Server 2017 上的 Linux 连接问题
Posted
技术标签:
【中文标题】Docker SQL Server 2017 上的 Linux 连接问题【英文标题】:Docker SQL Server 2017 on linux connection issue 【发布时间】:2020-05-13 13:51:55 【问题描述】:我的 Docker linux SQL Server 今天无法在我的机器上运行。
我不确定这是防火墙(我已全部关闭),还是 Docker 设置(因为我刚刚升级到最新的 Docker 版本),还是 Docker SQL Server 问题(但这在同一台机器上运行良好早)。
有人可以帮忙吗?
我尝试过使用 bash,
/opt/mssql-tools/bin/sqlcmd -S localhost,8010 -U SA -P Test123!
错误:
Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:登录超时已过期。
Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP 提供程序:错误代码 0x2749。
Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:建立与 SQL Server 的连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。。
docker compose 文件
version: '3'
services:
mssql:
network_mode: lsvc
image: microsoft/mssql-server-linux:2017-latest
container_name: mssql
hostname: mssql
volumes:
- ./.db:/var/opt/mssql/
- /var/opt/mssql/data
- ./sqlinit.sql:/scripts/sqlinit.sql
ports:
- 8010:1433
environment:
- ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=Test123!
command:
- /bin/bash
- -c
- |
# Launch MSSQL and send to background
/opt/mssql/bin/sqlservr &
# Wait for it to be available
echo "Waiting for MS SQL to be available"
/opt/mssql-tools/bin/sqlcmd -l 30 -S mssql -h-1 -V1 -U sa -P Test123! -Q "SET NOCOUNT ON SELECT \"YAY WE ARE UP\" , @@servername"
is_up=$$?
while [ $$is_up -ne 0 ] ; do
echo -e $$(date)
/opt/mssql-tools/bin/sqlcmd -l 30 -S mssql -h-1 -V1 -U sa -P Test123! -Q "SET NOCOUNT ON SELECT \"YAY WE ARE UP\" , @@servername"
is_up=$$?
sleep 1
done
# Run every script in /scripts
# TODO set a flag so that this is only done once on creation,
# and not every time the container runs
#for foo in /scripts/*.sql
/opt/mssql-tools/bin/sqlcmd -S mssql -U sa -P Test123! -l 30 -e -i /scripts/sqlinit.sql
#done
# So that the container doesn't shut down, sleep this thread
sleep infinity
【问题讨论】:
这条线是什么意思:network_mode: lsvc
?你可以用host
/bridge
测试或者只是注释掉吗?
【参考方案1】:
我怀疑 mssql 实例启动失败。
当服务器无法启动时查看您的 docker 文件,它会陷入无限循环。我建议您限制循环的重试次数,这样您就会有迹象表明服务器在启动时失败了。 或者更好地考虑使用 HEALTHCHECK 选项而不是循环脚本 见https://blog.couchbase.com/docker-health-check-keeping-containers-healthy/
要解决问题尝试
docker logs <mssql-container-id>
如果这不能提供足够的信息,请尝试连接到容器,因为这是一台简单的机器。
docker exec -it <mssql-container-id> bash
在 /var/opt/mssql/log/errorlog 中查找错误 见https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-troubleshooting-guide?view=sql-server-ver15
【讨论】:
这是我提到的日志。没有其他的。 C:\Users\tester>docker logs -f mssql Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:登录超时已过期。 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:TCP 提供程序:错误代码 0x2749。 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。检查实例名称是否正确以及 SQL 是否正确 docker logs 将显示来自容器的 STDOUT 和 STDERR 的输出。在您的情况下,这是您的 sqlcmd 命令输出。尝试我的第二个选项并查找服务器日志【参考方案2】:我找到了根本原因,不是因为docker mssql linux
但最新的 Docker Desktop Community 2.2.0.0
卸载后降级到旧版本,Docker Desktop Community 2.1.0.5。
现在正在工作,连接mssql成功。
不确定最新的 docker 桌面有什么新功能,无论如何...我现在将使用旧版本。
还有一点需要注意,“.db”文件夹(yml 文件所在的 windows 路径)必须在构建 docker 映像之前删除。
【讨论】:
以上是关于Docker SQL Server 2017 上的 Linux 连接问题的主要内容,如果未能解决你的问题,请参考以下文章
Docker 容器部署 SQL Server AlwaysOn AG