Docker 容器间通信

Docker inter-container communication

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

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

不幸的是,计时器无法到达给定主机名下的 InfluxDB:“无法连接到 InfluxDB Influx 1:联系源时出错”

这可能是什么原因?

这是我的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 的两次尝试中,我都超时了。

不得不说我这里用的是Banana Pi BPI-M1。是否有可能是由于 Linux 容器到容器的通信无法正常工作?

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

这应该可以解决问题(片段):

  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 (section Using the container with InfluxDB) for details on configuring the image and check the docker compose networking docs 有关网络和 DNS 命名的更多信息。

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

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

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

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