【发布时间】:2021-05-18 15:37:05
【问题描述】:
我有一个非常棘手的话题,因为我需要访问 AWS 中的私有数据库。为了连接到这个数据库,首先我需要创建一个这样的桥:
ssh -L 127.0.0.1:LOCAL_PORT:DB_URL:PORT -N -J ACCOUNT@EMAIL.DOMAIN -i ~/KEY_LOCATION/KEY_NAME.pem PC_USER@PC_ADDRESS
通过127.0.0.1:LOCAL_PORT:DB_URL 我可以在我的 Java 应用程序中连接到数据库。假设这种情况下的端口是 9991。
我的 docker 文件或多或少是这样的:
docker-compose.yml
version: '3.4'
services:
api:
image: fanmixco/example:v0.01
build:
context: .
network_mode: host
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://host.docker.internal:9991/MY_DB
Dockerfile
FROM openjdk:11
RUN mkdir /home/app/
WORKDIR /home/app/
RUN mkdir logs
COPY ./target/MY_JAVA_APP.jar .
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "MY_JAVA_APP.jar"]
图像运行正常。但是,如果我尝试:
- 使用 localhost:8080/MY_APP 失败
- 使用 127.0.0.1/MY_APP 失败
- 获取容器的 IP 并稍后使用它失败
- 使用 host.docker.internal/MY_APP 失败
我想知道如何测试我的应用。我知道它正在运行,因为我在控制台中收到一条成功消息,并且新数据已添加到数据库中,但我不知道如何测试或访问它。知道正确的方法吗?谢谢。
附:
-
我在 Docker Desktop for Windows 中运行我的图像。
-
我有另一个使用 tomcat 9 并运行
CMD ["catalina.sh", "run"]的案例,我知道它正在工作,因为我在控制台中收到此消息:
INFO [main] org.apache.catalina.startup.Catalina.start 服务器在 [9905] 毫秒内启动
但我无法再次访问它。
【问题讨论】:
-
抱歉,我现在不在电脑前尝试。但是
docker-compose ps输出了什么? -
docker-compose ps通常会告诉您哪个主机端口映射到任何特定的容器端口。我只是不确定将network_mode设置为host时它的行为如何。 -
你好@ZhaoLim,"如果你对一个容器使用主机网络模式,那么该容器的网络堆栈不会与Docker主机隔离(容器共享主机的网络命名空间),并且容器没有分配自己的 IP 地址。例如,如果您运行一个绑定到端口 80 的容器并使用主机网络,则容器的应用程序在主机 IP 地址的端口 80 上可用。" 更多信息:docs.docker.com/network/host
标签: docker docker-networking docker-desktop