【问题标题】:Connect to a port from docker container to a opened port in the host连接到从 docker 容器到主机中打开的端口的端口
【发布时间】:2017-10-18 02:39:47
【问题描述】:

我有一个 Spring Boot 应用程序,它使 jdbc 连接到不同 VPC 中的数据库。从我的本地我无法访问这个数据库,所以当我在本地部署我的应用程序时,我必须打开一个 ssh 隧道才能连接到数据库。这就是隧道的设置方式:

ssh -L 61616:data_base_host:data_base_port myuser@tunnel_server

然后我的应用使用以下方式连接:

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

现在我需要将我的应用程序放入 Docker 容器中。这就是我运行 docker 映像的方式:

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

而且没用。

有什么想法吗?

【问题讨论】:

  • Docker 没有提供简单的获取主机 ip 的方法。根据 docker 方法,如果您使用应用程序运行容器,则无需在主机上运行 db,您还应该将其容器化。如果数据库在容器内,连接数据库非常容易。不过,您可以尝试一些解决方法,看看这个答案的第二部分stackoverflow.com/a/24326540/2065796 您还可以考虑从 docker 容器内部建立 ssh 隧道的选项。

标签: java docker spring-boot jdbc ssh


【解决方案1】:

我不知道您是如何在 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

创建一个 docker-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

创建一个泊坞窗图像

docker build -t 示例。

运行

docker-compose up -d

【讨论】:

  • 它是一个spring boot app,它是一个jar文件。这是我的 CMD:CMD java -jar lq-rateloader.jar -Denv1=value1... 我有很多 -D 变量。
  • 您可以在 dockerfile 中进行更改,撰写文件适用于任何情况。
  • 我想你不明白我的问题。在我的主机上,我通过端口 61616 设置了一个 ssh 隧道。我需要让我的 Docker 映像通过主机发送 jdbc 连接。
猜你喜欢
  • 2017-02-11
  • 2017-04-11
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多