Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Can';无法从Docker容器连接到外部SQL Server_Sql Server_Spring Boot_Docker_Intellij Idea_Connection - Fatal编程技术网

Sql server Can';无法从Docker容器连接到外部SQL Server

Sql server Can';无法从Docker容器连接到外部SQL Server,sql-server,spring-boot,docker,intellij-idea,connection,Sql Server,Spring Boot,Docker,Intellij Idea,Connection,我开发了一个SpringBoot(Java)应用程序,可以调用端口1433上的外部SQL Server。SQL Server实例位于本地(不是本地SQL Server实例)。但是,可以使用IntelliJ或SQL客户端从我的桌面访问它 我正在使用MicrosoftSQLServerJDBC连接器与实例通信 如果我从IntelliJ运行应用程序,一切正常,应用程序可以调用SQL Server,执行命令并返回结果集 但是,现在我正在尝试将api应用程序Dockerize。该容器执行通常的Spring

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

我正在使用MicrosoftSQLServerJDBC连接器与实例通信

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

但是,现在我正在尝试将api应用程序Dockerize。该容器执行通常的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网络

谢谢你的帮助

它应该有用

NB我假设您使用的不是
myexternalsqlserver.domain

测试容器的一种方法是将其装入外壳(或创建变体),然后尝试解析SQL Server的主机名:

docker运行——交互式——tty openjdk:11.0.4-jre-slim-buster/bin/bash
#然后从容器的外壳内
apt更新和apt安装-y dnsutils
nslookup${SQL\U SERVER}
如果成功了,那就是你的代码

如果不是,那就是网络


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

谁解析名称
myexternalsqlserver.domain
?您的网络上是本地主机还是其他ip?另外,你在linux、mac、windows上?我现在在尝试“apt”命令时遇到了这个问题:W:未能获取无法解析“deb.debian.org”,我可以访问那些URL(在浏览器中)。要清楚。。。。当您尝试运行docker运行--interactive--tty openjdk:11.0.4-jre-slim-buster/bin/bash-c“apt update&&apt install-y dnsutils&&nslookup google.com”时会发生什么?这应该行得通。如果没有,你就有另一个问题。它试图联系deb.debian.org,但却无法到达那里。所以,它甚至不能安装dnsutils。我想我可能需要etc/docker/daemon.json来为我的dns网关添加一个ip地址。我记得几个月前我在下载一些python内容时不得不这么做。@KSS您可以使用docker run命令的
--dns 8.8.8
选项添加dns网关。