【问题标题】:Docker access localhost port from containerDocker 从容器访问 localhost 端口
【发布时间】:2017-10-27 10:56:36
【问题描述】:

我有一个运行 Nuxt.js (Vue.js) 应用程序的容器,由 docker_composes.yml 定义:

version: '3'
services:
  vue:
    build: .
    image: registry.gitlab.com/something/app:${TAG}
    environment:
      - apiPath="http://localhost:5000/"
      - filePath="http://localhost:3000/"
    ports:
     - "${EXPOSED_PORT:-80}:${NUXT_PORT:-3000}"
    restart: always

该应用程序是一个前端。我在 localhost 上的端口5000 上运行后端。 当容器化应用程序尝试连接到 http://localhost:5000/ 时,它会失败。

我有哪些选择? 我不想将后端放入docker_composes.yml 并通过链接连接它们。如果这是唯一的选择,我会的。

【问题讨论】:

  • 你找到解决办法了吗?

标签: docker docker-compose


【解决方案1】:

您的docker-compose.yaml 文件中的localhost 指的是容器。

为了访问您的本地机器,请使用host.docker.internal 而不是localhost

【讨论】:

  • 或者在宿主网络而不是默认网桥上运行。
  • 我在上面试过了,但是同样的错误,无法连接本地主机,它拒绝我的系统网络http://host.docker.internal:8042/changes?
  • 我搜索此设置的时间太长了。谢谢。
  • @151291 你找到解决问题的方法了吗?如果您运行的是 Linux,这可能是原因:github.com/docker/for-linux/issues/264
  • 如果浏览器中没有http://host.docker.internal,请不要上当。您仍然可以从正在运行的 dockerized 应用程序中看到它。
【解决方案2】:

你可以试试

network_mode:“主机”

https://docs.docker.com/compose/compose-file/#network_mode

如果您使用的是 Windows 或 Mac,您应该可以使用:

docker.for.win.localhost

docker.for.mac.localhost

【讨论】:

  • 我尝试了 network_mode: "host",但没有成功。容器无法与我的 localhost:5000 端口通信。
  • @euphe 检查服务是否在 0.0.0.0 而不是 localhost 上运行
【解决方案3】:

如果您想访问主机的本地主机,您可以使用主机的 IP 地址。在 Linux 中使用 ifconfig 命令获取您的 IP 地址。 例如:如果您的主机 IP 是 192.168.1.7,您可以使用 192.168.1.7:5000

【讨论】:

  • 如果您不管理容器(例如在本地运行 AWS Lambda 函数),这会很有帮助。在本地开发者的配置文件中更改本地 IP 比开始干扰容器要容易得多。
【解决方案4】:

容器可以相互通信的一种方式是它们连接到一个公共网络。它们可以使用容器名称相互引用。示例前端可以使用 backend:5000 到达后端,其中 backend 是后端容器的名称。

要实现这一点,请使用 docker network create app-network 创建一个 docker 网络。使用docker container attach <backend-container> app-network 将后端容器附加到此网络。最后,将 compose 文件更新为以下内容:

version: '3'
services:
  vue:
    build: .
    image: registry.gitlab.com/something/app:${TAG}
    environment:
      - apiPath="http://backend:5000/" # replace backend-container name
      - filePath="http://localhost:3000/"
    ports:
     - "${EXPOSED_PORT:-80}:${NUXT_PORT:-3000}"
    restart: always
    networks:
     - app-network

networks:    
  app-network:
    external: true

【讨论】:

  • 我会试试的。如果后端不是容器,我可以只指定一个 IP 地址吗?后端可以是 localhost(运行 docker-composes 的主机)吗?
  • @Euphe 如果后端不在容器中运行,而是在主机上运行,​​则需要连接到主机。请注意,从容器的角度来看 localhost 不是主机。有几种方法可以从容器连接到主机。检查stackoverflow.com/questions/31324981/…
猜你喜欢
  • 2020-09-30
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多