sql-server - 无法从 Docker 容器连接到外部 SQL Server

标签 sql-server spring-boot docker intellij-idea connection

我开发了一个 SpringBoot(Java) 应用程序,它在端口 1433 上调用外部 SQL Server。SQL Server 实例位于本地(不是本地 SQL Server 实例)。但是,可以使用 IntelliJ 或 SQL 客户端从我的桌面访问它。

我正在使用 Microsoft SQL Server JDBC 连接器与实例进行通信。

如果我从 IntelliJ 运行应用程序一切正常,应用程序可以调用 SQL Server,执行命令并返回结果集。

但是,现在我正在尝试 Dockerize api 应用程序。容器执行通常的 SpringBoot 初始化,但是当它尝试调用 SQL Server 时,我收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host myexternalsqlserver.domain, port 1433 has failed. Error: "myexternalsqlserver.domain. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:234)
    at com.microsoft.sqlserver.jdbc.SQLServerException.ConvertConnectExceptionToSQLServerException(SQLServerException.java:285)
    at com.microsoft.sqlserver.jdbc.SocketFinder.findSocket(IOBuffer.java:2434)
    at com.microsoft.sqlserver.jdbc.TDSChannel.open(IOBuffer.java:659)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2546)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2216)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2067)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1204)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:825)
    at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
    at com.symetra.SdsApi.SqlConnector.getResultSet(SqlConnector.java:26)

这是我的 Docker 文件
FROM openjdk:11.0.4-jre-slim-buster
VOLUME /tmp

COPY target/myapi-1.0-SNAPSHOT.jar app.jar
EXPOSE 8080
EXPOSE 1433
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker -jar /app.jar" ]

这些是我用来构建和运行容器的 Docker 命令:
docker build -t myapi . && docker run -p 8080:8080 -p 1433:1433 --name myapi myapi "java","-jar","myapi-1.0-SNAPSHOT.jar"

1433端口的映射我觉得没必要,只是个实验。我应该能够通过主机上的端口 1433 在容器外部进行通信。主机上的端口 1433 没有被阻止,因为我在容器外运行它没有问题。

最后,这是我正在使用的连接字符串:
//Create Connection Url.
String connectionUrl="jdbc:sqlserver://myexternalsqlserver.domain:1433;database=mydb;user=MyUser;password=MyPassword";

我不确定我在这里做错了什么。我想知道是否需要设置 Docker 网络。

谢谢你的帮助!

最佳答案

它应该工作。

注意我假设 myexternalsqlserver.domain不是你正在使用的。

测试容器的一种方法是对其进行 shell(或创建一个变体)并尝试解析 SQL Server 的主机名:

docker run --interactive --tty openjdk:11.0.4-jre-slim-buster /bin/bash

# then from within the container's shell
apt update && apt install -y dnsutils
nslookup ${SQL_SERVER}

如果成功,那就是你的代码。

如果没有,那就是网络。

注意您的容器不需要发布 1443 ( --publish=1433:1433 ),因为它正在使用该端口(在 SQL Server 上)而不是暴露端口本身。

关于sql-server - 无法从 Docker 容器连接到外部 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60456486/

相关文章:

docker - 为什么我可以从私有(private) repo 中提取图像,但不能使用它创建 kubernetes 部署?

docker - cAdvisor prometheus 集成将 container_cpu_load_average_10s 返回为 0

mysql - 返回第一个匹配行提高查询性能

sql - 使用 sp_rename 重命名 SQL 表有什么好处?

c# - 更新 Entity Framework 中的计算列

java - Spring Boot 多上下文 application.properties 问题

sql-server - SQL Server Management Studio 使用二进制字符保存 .sql 文件

java - 找不到类 org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor 的序列化程序

带有 JWT 身份验证和 csrf token 的 Spring 启动无状态应用程序

sql-server - 无法从Linux管理基于docker的mysql服务器