【发布时间】:2021-12-02 07:26:56
【问题描述】:
问题
我正在尝试创建一个将托管三个服务的 docker-compose 文件。 InfluxDB、Grafana 和填充数据库的客户 Dockerfile 中的自定义脚本。我遇到了网络问题,由于连接被拒绝错误(如下所示),自定义脚本无法连接到 InfluxDB。
到目前为止的工作情况
有趣的是,当我从我的 docker-compose 文件中删除自定义脚本服务(称为 ads_agent)并从 localhost 运行该脚本,或者甚至在其自己的容器中构建和运行该 Dockerfile 时,它连接很好。
两者有什么区别
我的脚本读取一个名为 KTS_TELEMETRY_INFLUXDB_URL 的环境变量,用于连接 InfluxDB 客户端的 URL。当我只从命令行运行时,我可以使用“http://localhost:8086”作为 URL,这是可行的。当我将脚本包装在 Docker 容器中时,我使用本地机器的 LAN IP 地址,因为对于它来说,localhost 只是容器。但是,这很好用。
在我的 docker-compose 中,由于所有三个服务都在同一个网络上,所以我使用“http://influxdb:8086”,因为该主机名应该绑定到该服务的网络接口。确实如此,因为 Grafana 使用该 URL 连接得很好。可悲的是,当我使用脚本尝试此操作时,连接被拒绝。
错误
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7f18c1fec970>: Failed to establish a new connection: [Errno 111] Connection refused
我的代码
这是我的 docker-compose.yaml
version: "3"
services:
influxdb:
container_name: influxdb
image: influxdb:2.0.9-alpine # influxdb:latest
networks:
- telemetry_network
ports:
- 8086:8086
volumes:
- influxdb-storage:/var/lib/influxdb2
restart: always
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=$KTS_TELEMETRY_INFLUXDB_USERNAME
- DOCKER_INFLUXDB_INIT_PASSWORD=$KTS_TELEMETRY_INFLUXDB_PASSWORD
- DOCKER_INFLUXDB_INIT_ORG=$KTS_TELEMETRY_INFLUXDB_ORG
- DOCKER_INFLUXDB_INIT_BUCKET=$KTS_TELEMETRY_INFLUXDB_BUCKET
- DOCKER_INFLUXDB_INIT_RETENTION=$KTS_TELEMETRY_INFLUXDB_RETENTION
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=$KTS_TELEMETRY_INFLUXDB_TOKEN
grafana:
container_name: grafana
image: grafana/grafana:8.1.7 # grafana/grafana:latest
networks:
- telemetry_network
ports:
- 3000:3000
volumes:
- grafana-storage:/var/lib/grafana
restart: always
depends_on:
- influxdb
ads_agent:
container_name: ads_agent
build: ./ads_agent
networks:
- telemetry_network
restart: always
depends_on:
- influxdb
environment:
- KTS_TELEMETRY_INFLUXDB_URL=http://influxdb:8086
- KTS_TELEMETRY_INFLUXDB_TOKEN=$KTS_TELEMETRY_INFLUXDB_TOKEN
- KTS_TELEMETRY_INFLUXDB_ORG=$KTS_TELEMETRY_INFLUXDB_ORG
- KTS_TELEMETRY_INFLUXDB_BUCKET=$KTS_TELEMETRY_INFLUXDB_BUCKET
networks:
telemetry_network:
volumes:
influxdb-storage:
grafana-storage:
这是我的 ads_agent/Dockerfile
FROM python:3.9
COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install -r /requirements.txt
COPY main.py .
ENTRYPOINT /usr/local/bin/python3 /main.py
ads_agent/requirements.txt 只有 influxdb-client,这是我的 ads/main.py
import os
from influxdb_client import InfluxDBClient, Point, WritePrecision
from influxdb_client.client.write_api import SYNCHRONOUS
from datetime import datetime
import random
import time
token = os.environ["KTS_TELEMETRY_INFLUXDB_TOKEN"]
org = os.environ["KTS_TELEMETRY_INFLUXDB_ORG"]
bucket = os.environ["KTS_TELEMETRY_INFLUXDB_BUCKET"]
url = os.environ["KTS_TELEMETRY_INFLUXDB_URL"]
client = InfluxDBClient(url=url, token=token)
dbh = client.write_api(write_options=SYNCHRONOUS)
while True:
symbol_name = 'rand_num'
value = random.random()
timestamp = datetime.utcnow()
print(timestamp, symbol_name, value)
point = Point("mem") \
.field(symbol_name, value) \
.time(timestamp, WritePrecision.NS)
dbh.write(bucket, org, point)
time.sleep(1)
【问题讨论】:
标签: docker docker-compose influxdb docker-networking influxdb-python