Не удается подключиться к внешнему SQL серверу из Docker контейнера - PullRequest
1 голос
/ 28 февраля 2020

Я разработал приложение 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 сеть.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 28 февраля 2020

Это должно работать.

NB Я предполагаю, что 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}

Если это удастся, это ваш код.

Если нет, то это сеть.

NB Ваш контейнер не должен публиковать sh 1443 (--publish=1433:1433), поскольку он использует этот порт (на сервере SQL), не предоставляя сам порт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...