如何配置Traefik实现FiftyOne与CVAT容器8080端口HTTP通信?
解决FiftyOne容器与CVAT容器的通信问题
问题根源:容器内的127.0.0.1指向容器自身的网络命名空间,而非主机或CVAT容器,所以直接访问127.0.0.1:8080会失败。以下是两种符合你需求的解决方案:
方案一:利用Docker服务名直接通信(推荐)
因为FiftyOne和CVAT容器已加入同一个cvat_cvat网络,Docker内置的DNS会自动解析服务名称到对应容器的IP。
- 确认CVAT服务名:在CVAT的
docker-compose.yml中,CVAT服务器的服务名是cvat_server。 - 修改FiftyOne内的CVAT访问地址:将请求地址从
http://127.0.0.1:8080改为http://cvat_server:8080。 - 验证通信:进入FiftyOne容器执行命令:
若返回CVAT的响应页面,则通信正常。docker exec -it <fiftyone_container_id> curl http://cvat_server:8080
这种方式不需要依赖Traefik,是容器间通信的原生方案,性能更优且配置简单。
方案二:通过Traefik反向代理访问CVAT
若你坚持使用Traefik路由,可通过以下配置实现:
- 确认Traefik服务名:在CVAT的
docker-compose.yml中,Traefik的服务名是traefik。 - 通过Traefik路由访问CVAT:在FiftyOne容器内,需要通过Traefik的Host规则来路由请求,执行命令:
这里的docker exec -it <fiftyone_container_id> curl -H "Host: ${CVAT_HOST:-localhost}" http://traefikHost头需要和CVAT的Traefik路由规则一致(CVAT配置中traefik.http.routers.cvat.rule=Host(${CVAT_HOST:-localhost}))。 - 代码中适配:在FiftyOne的业务代码中,向
http://traefik发送请求时,需添加Host头为你设置的CVAT_HOST值(如127.0.0.1)。
优化FiftyOne的docker-compose.yml(可选)
由于已通过Traefik代理FiftyOne,可移除主机端口映射(ports: -5151:5151),避免端口冲突,同时保持容器隔离性:
version: '3.8' services: fiftyone: command: ['python', '/usr/local/lib/python/dist-packages/fiftyone/server/main.py', '--port', '5151'] environment: FIFTYONE_DEFAULT_APP_ADDRESS: 0.0.0.0 image: voxel51/fiftyone:latest volumes: - type: bind source: /path/to/fiftyon/shared target: /fiftyone networks: - cvat_cvat labels: - traefik.enable=true - traefik.http.services.fiftyone.loadbalancer.server.port=5151 - traefik.http.routers.fiftyone.rule=Host(`${CVAT_HOST:-localhost}`) && PathPrefix(`/fiftyone`) - traefik.http.routers.fiftyone.entrypoints=web networks: cvat_cvat: external: true
注:这里添加了
PathPrefix(/fiftyone),避免和CVAT的路由冲突,你可根据实际需求调整规则。
内容的提问来源于stack exchange,提问作者tvoirand
相关产品推荐
相关产品推荐

