2017-10-17 127 views
0

我有一个Spring引导应用程序,使jdbc连接到不同VPC中的数据库。从我的本地我没有访问这个数据库,所以当我在本地部署我的应用程序时,我必须打开一个ssh隧道才能连接到数据库。这是怎样的隧道被设置:连接到一个端口从码头集装箱到主机打开的端口

ssh -L 61616:data_base_host:data_base_port [email protected]_server 

然后我的应用程序连接使用:

jdbc:sqlserver://localhost:61616.... 

现在我需要把我的应用程序码头工人,容器内。这是我如何运行我的泊坞窗图像:

docker run -p 9018:9018 myapp 

9018是http端口。当Spring Boot应用程序在Docker内部启动时,它无法连接到数据库。错误是:

Failed to initialize pool: The TCP/IP connection to the host localhost, port 61616 has failed. 

所以我需要将容器内的端口61616绑定到主机中的端口61616。我能够修复使用此JDBC URL我的问题:

jdbc:sqlserver://docker.for.mac.localhost:61616 

使用别名docker.for.mac.localhost使的伎俩,但它是面向Mac平台的解决方案。我也试过:

docker run -p 9018:9018 -p 61616:61616 myapp 

并没有工作。

任何想法?

+0

码头工人并没有提供一种简单的方式来获得主机的IP。根据docker方法,如果你在应用程序中运行容器,则不需要在主机上运行db,你还应该容纳它。如果数据库位于容器内部,则很容易连接到数据库。不过,你可以尝试一些解决方法,看看这个答案的第二部分https://stackoverflow.com/a/24326540/2065796 你也可以考虑一个选项,从docker容器内部建立ssh隧道。 –

回答

0

我不知道你如何在docker中运行你的应用程序。我有一个Dockerfile为我运行。

注:根据您的要求更改端口

FROM openjdk:8-jre-alpine 

ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \ 
    APP_SLEEP=0 \ 
    JAVA_OPTS="" 

ADD *.war /app.war 

EXPOSE 8080 
CMD echo "The application will start in ${APP_SLEEP}s..." && \ 
    sleep ${APP_SLEEP} && \ 
    java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.war 

创建泊坞窗,compose.yml文件

version: '2' 
services: 
    sample-app: 
     image: sample 
     environment: 
      - SPRING_PROFILES_ACTIVE=prod,swagger 
      - SPRING_DATASOURCE_URL=jdbc:sqlserver://sample-mssql:1433;database=testdb 
      - APP_SLEEP=10 # gives time for the database to boot before the application 
     ports: 
      - 8080:8080 
    sample-mssql: 
     image: microsoft/mssql-server-linux:latest 
     # volumes are not supported on macOS 
     # volumes: 
     #  - ~/volumes/jhipster/testdb/mssql/:/var/opt/mssql/data/ 
     environment: 
      - ACCEPT_EULA=Y 
      - SA_PASSWORD=yourStrong(!)Password 
     ports: 
      - 1433:1433 

创建一个泊坞窗图像

泊坞窗构建-t样本。

RUN

码头工人,组成了-d

+0

这是一个弹簧启动应用程序,它是一个jar文件。这是我的CMD: CMD java -jar lq-rateloader。jar -Denv1 = value1 ... 我有很多-D变量。 – Perimosh

+0

您可以更改您的dockerfile,撰写文件适用于任何情况。 –

+0

我想你不明白我的问题。在我的主机上,我通过端口61616设置了一个ssh隧道。我需要让我的Docker镜像通过主机发送jdbc连接。 – Perimosh

相关问题