【问题标题】:Docker inter-container communicationDocker 容器间通信
【发布时间】:2020-10-26 11:33:52
【问题描述】:

我在这里面临一个相对简单的问题,但我开始想知道为什么它不起作用。

我想用 Docker Compose 启动两个 Docker 容器:InfluxDB 和 Chronograph。

不幸的是,计时码表无法在给定的主机名下到达 InfluxDB:“无法连接到 InfluxDB Influx 1: Error contacting source”

这可能是什么原因?

这是我的 docker-compose.yml

version: "3.8"

services:
  influxdb:
    image: influxdb
    restart: unless-stopped
    ports:
      - 8086:8086
    volumes:
      - influxdb-volume:/var/lib/influxdb
    networks:
      - test

  chronograf:
    image: chronograf
    restart: unless-stopped
    ports:
      - 8888:8888
    volumes:
      - chronograf-volume:/var/lib/chronograf
    depends_on:
      - influxdb
    networks:
      - test

volumes:
  influxdb-volume:
  chronograf-volume:

networks:
  test:
    driver: bridge

我还尝试在两个容器内启动一个 shell,然后相互 ping 容器或使用 wget 获取另一个容器的 HTTP-API。即使容器之间的这种通信也不起作用。在使用 wget 和 ping 的两次尝试中,我都会超时。

不得不说我这里用的是香蕉派 BPI-M1。是否有可能是由于 Linux 导致容器到容器的通信不起作用?

【问题讨论】:

  • 你得到什么错误?
  • 在计时码表的 Web 界面上,我得到“无法连接到 InfluxDB Influx 1:错误联系源”,而在外壳上,我只是通过 wget 和 ping 得到超时。

标签: docker docker-compose influxdb chronograf


【解决方案1】:

如果未配置,chronograf 将尝试访问localhost:8086 上的 influxdb。为了能够访问正确的 influxdb 实例,您需要使用 --influxdb-url 命令行标志或(个人偏好)环境变量 INFLUXDB_URL 相应地指定 url。这些应该设置为 http://influxdb:8086 的值,这是从您的撰写文件的服务名称派生的 docker DNS 名称(services 下一级的键)。

这应该可以解决问题(sn-p):

  chronograf:
    image: chronograf
    restart: unless-stopped
    ports:
      - 8888:8888
    volumes:
      - chronograf-volume:/var/lib/chronograf
    environment:
      - INFLUXDB_URL=http://influxdb:8086
    depends_on:
      - influxdb
    networks:
      - test

请查看chronograf readme将容器与 InfluxDB 一起使用部分)了解有关配置映像的详细信息,并查看the docker compose networking docs 了解有关网络和 dns 命名的更多信息。

【讨论】:

  • 非常感谢您的提示。我也试过这个变种。虽然 Chronograph 在开始时没有询问我的配置,但它仍然无法正常工作。在日志中,我收到以下错误消息: level=info msg="Failed to retrieve database version" error="request to backend timed out
  • 如果 chronograf 卷中可能已经存储了某些内容,我不确定配置值的优先级。如果您还没有流入的相关数据,我会尝试通过docker-compose down -v 或通过手动删除 chronograf 命名卷从一个干净的状态开始,就像这里一样。 stackoverflow.com/a/58423521/4854965 有帮助吗?
  • 您能否通过向主机上的映射端口发送请求或使用 influx 工具来检查 influxdb 是否确实在运行并响应请求?
  • 感谢您的帮助。我发现我系统上的另一个组件在启动时清空了 iptables 表 nat 和过滤器。因此,容器间通信不再起作用。
  • 谢谢,当我将 localhost 更改为 influxdb 时,它对我有用。
【解决方案2】:

Docker 服务在表过滤器和 nat 中创建一些 iptables 条目。我的 OpenVPN 网关脚本在启动时执行了以下命令:

iptables --flush -t filter
iptables --flush -t nat

这将从 Docker 中删除条目,并且容器与 Internet 之间的通信将不再可能。

我已经重写了脚本,现在一切正常了。

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2017-10-17
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多