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 数据库

docker快速部署sql server 2017开发版

DOCKER中sql server2017连接外部出错

Docker 容器部署 SQL Server AlwaysOn AG

Docker 容器部署 SQL Server AlwaysOn AG

Docker 容器部署 SQL Server AlwaysOn AG