【问题标题】:How to access a website running in a container when you´re using network_mode: host使用network_mode时如何访问在容器中运行的网站:主机
【发布时间】: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 失败

我想知道如何测试我的应用。我知道它正在运行,因为我在控制台中收到一条成功消息,并且新数据已添加到数据库中,但我不知道如何测试或访问它。知道正确的方法吗?谢谢。

附:

  1. 我在 Docker Desktop for Windows 中运行我的图像。

  2. 我有另一个使用 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


【解决方案1】:

由于我无法在自己的机器上复制系统,因此根据上述信息我不太确定问题出在哪里。

不过,以下是一些值得一看的地方:

  • 您可能会遇到与此类似的问题:https://github.com/docker/for-mac/issues/1031,因为您正在使用 ssh 和 AWS DB 进行网络魔法

  • 您应该尝试指定 build/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
    

希望对你有帮助??,祝你好运?

【讨论】:

    【解决方案2】:

    我猜你需要绑定你的容器的端口。

    尝试将“端口”属性添加到您的 docker-compose 文件中

    version: '3.4'
    services:
      api:
        image: fanmixco/example:v0.01
        build:
          context: .
        port:
          - 8080:8080
        network_mode: host
        environment:
          - SPRING_DATASOURCE_URL=jdbc:postgresql://host.docker.internal:9991/MY_DB
    

    看看https://docs.docker.com/compose/compose-file/compose-file-v3/#endpoint_mode

    【讨论】:

    • 您不能使用主机配置中的端口。
    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 2021-11-04
    • 2020-07-17
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2022-10-06
    • 2020-04-24
    相关资源
    最近更新 更多