docker - 使用network_mode时如何访问在容器中运行的网站:主机
问题描述
我有一个非常棘手的话题,因为我需要访问 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 文件或多或少看起来像这样:
码头工人-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 失败
我想知道如何测试我的应用程序。我知道它正在运行,因为我在控制台中收到一条成功消息,并且新数据已添加到数据库中,但我不知道如何测试或访问它。知道正确的方法吗?谢谢。
PS:
我在 Docker Desktop for Windows 中运行我的图像。
我有另一个使用 tomcat 9 并正在运行的案例
CMD ["catalina.sh", "run"]
,我知道它正在工作,因为我在控制台中收到此消息:
INFO [main] org.apache.catalina.startup.Catalina.start 服务器在 [9905] 毫秒内启动
但我无法再次访问它。
解决方案
根据上述信息,我不确定问题出在哪里,因为我无法在自己的机器上复制系统。
但是,这些是一些值得关注的地方:
您可能会遇到与此类似的问题:https ://github.com/docker/for-mac/issues/1031因为您正在使用的网络魔法
ssh
和 AWS DB您应该尝试指定构建/
Dockerfile
或图像,并避免同时指定version: '3.4' services: api: image: fanmixco/example:v0.01 # choose using an image build: # or building from a Dockerfile context: . # but not both network_mode: host environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://host.docker.internal:9991/MY_DB
希望有帮助,祝你好运
推荐阅读
- javascript - React + immutable.js:将 Map 合并到 Map 列表中以更新状态
- c++ - 用于验证 Visual Studio 一致性开关对生成代码的影响的工具
- r - 谷歌表格上的 R 脚本
- mysql - 我的 SQL 语句有问题
- android - 过滤数据后如何重新绑定 SwipeMenuListView onMenuItemClick 项目?
- rx-java - 如何在 RxJava Iterable Observable 中重复一个但继续其他的
- julia - Julia 导入包存储为变量
- docker - 拦截 websocket 并使用 NGINX 附加一个新令牌
- c# - 从 C# 访问 json 节点的问题
- javascript - 较低节点上的 firebase 事务 - 超出最大调用堆栈大小