Я разработал приложение SpringBoot (Java), которое обращается к внешнему SQL серверу через порт 1433. Экземпляр SQL Server расположен локально (не локальные SQL экземпляры сервера). Тем не менее, он доступен с моего компьютера с помощью IntelliJ или SQL клиентов.
Я использую разъем Microsoft SQL Server JDB C для связи с экземплярами.
Если я запустить приложение из IntelliJ все хорошо, приложение может вызвать сервер SQL, выполнить команду и вернуть набор результатов.
Однако сейчас я пытаюсь Dockerize API-приложение. Контейнер выполняет обычную инициализацию SpringBoot, но когда он пытается вызвать сервер SQL, я получаю следующую ошибку:
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";
I ' Я не уверен, что я делаю не так здесь. Мне интересно, нужно ли мне настроить Docker сеть.
Спасибо за вашу помощь!