我已经开发了一个SpringBoot(Java)应用程序,该应用程序在端口1433上调用一个外部SQL Server。该SQL Server实例位于本地(不是本地SQL Server实例)。但是,可以使用IntelliJ或SQL客户端从我的桌面访问它。
我正在使用Microsoft SQL Server JDBC连接器与实例进行通信。
如果我从IntelliJ运行该应用程序一切正常,则该应用程序可以调用SQL Server,执行命令并返回结果集。
但是,现在我正在尝试对api应用进行Docker化。容器执行通常的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网络。
感谢您的帮助!
答案 0 :(得分:0)
应该可以。
注意事项:我假设您使用的不是myexternalsqlserver.domain
。
一种测试容器的方法是将其装入外壳(或创建一个变体)并尝试解析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上)而不暴露该端口本身。