【问题标题】:Accessing a service on the PROPER IP running in docker container on a Linux host访问在 Linux 主机上的 docker 容器中运行的 PROPER IP 上的服务
【发布时间】:2021-04-04 23:11:43
【问题描述】:

我的问题是 k6 和 InfluxDB 特有的,但我认为根本原因更普遍。

我正在使用官方 k6 发行版及其 docker-compose.yml 运行 Grafana 和 InfluxDB,我从 docker-compose up -d influxdb grafana 命令开始。

可以从 localhost:3000 访问 Grafana 仪表板,但使用推荐的命令 $ docker run -i loadimpact/k6 run --out influxdb=http://localhost:8086/myk6db - <script.js 运行 k6(遵循 this 指南)k6 会引发以下错误(在 Linux 和 MacOS 上也是如此):

level=error msg="InfluxDB: Couldn't write stats" error="Post \"http://localhost:8086/write?consistency=&db=myk6db&precision=ns&rp=\": dial tcp 127.0.0.1:8086: connect: connection refused"

我也尝试了使用 localhost 和 127.0.0.1 以及 InfluxDB 的命令。也有docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' k6_influxdb_1返回的IP地址,要么因为上述错误而失败,要么没有工作,这意味着k6没有抱怨,但InfluxDB中没有出现数据。

然而,如果我查询网络接口正在使用的“内部 IP”地址(使用 ifconfig 命令)并使用该 IP(192.168.1.66),一切正常:

docker run -i loadimpact/k6 run --out influxdb=http://192.168.1.66:8086/k6db  - <test.js

所以我的问题是:

  1. 为什么 Grafana 与 localhost:3000 可以正常工作而 InfluxDB 与 localhost:8086 不能正常工作?
  2. 为什么只有“内部 IP”有效,其他 IP 无效?

我知道有一个类似的问题,但这并没有回答我的问题。

【问题讨论】:

    标签: docker docker-compose ip influxdb k6


    【解决方案1】:

    Docker 容器在隔离的网络空间中运行。 Docker 可以维护内部网络,并且有 Compose 语法来创建它们。

    如果您从 Docker 空间外部但在同一主机上调用 Docker 容器,您通常可以使用 localhost 和 Compose ports: 部分中列出的第一个端口号连接到它。如果查看链接到的docker-compose.yml 文件,它列出了ports: [3000:3000],因此主机上的3000 端口转发到容器中的3000 端口;如果您从同一主机上的浏览器调用http://localhost:3000,它将到达该转发端口。

    否则,从一个容器到另一个容器的调用通常可以使用容器的名称(如docker run --name)或 Compose 服务名称;但是,它们必须在同一个 Docker 网络上。那个docker-compose.yml 文件也列出了

    services:
      influxdb:
        networks:
          - k6
          - grafana
    

    因此您可以使用服务的正常端口号访问http://influxdb:8086,前提是调用容器位于这两个网络之一上。如果服务有ports:,则不会考虑它们进行容器间调用。

    在 Docker 文档中,Networking in Compose 提供了有关此设置的更多详细信息。

    最后一个技巧可以帮助您运行您尝试运行的特定命令。 docker-compose run 将运行一次性命令,使用 docker-compose.yml 中某些容器的设置,除了没有它的 ports: 并替换它的 command:。您引用的docker-compose.yml 文件包括k6 容器,位于k6 网络上,运行loadimpact/k6 映像。所以你可能可以运行

    docker-compose run k6 \
      run --out influxdb=http://influxdb:8086/myk6db - \
      <script.js
    

    (可能docker-compose.yml 中的K6_OUT 环境变量可以为您提供--out 选项。)

    您永远不需要查找容器专用 IP 地址。它们不适用于各种常见场景,在用于容器之间调用的 Docker 网络和用于来自 Docker 外部调用的已发布端口之间,有更好的方法来调用容器。

    【讨论】:

    • 非常感谢建设性的语气和细节!我不确定您是否要这样做,但我刚刚意识到 k6 没有运行。所以 Grafana 和 InfluxDB 起来了,但 k6 没有。使用docker run 运行 k6 不足以在 InfluxDB 的网络上拥有 k6。使用您上次建议的 docker-compose run 命令可以解决此问题。
    猜你喜欢
    • 2022-10-06
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多