如何通过Docker、Docker Compose部署Freqtrade+Binance-Proxy并解决网络互通问题
问题描述
背景
- 正在学习Docker网络相关知识,目前遇到Freqtrade与Binance-Proxy两个服务无法正常通信的问题
- 为两个服务分别创建了容器,proxy配置了静态IP,各Docker网络网关信息如下:
root@DESKTOP-74LHUDF:/mnt/e/Python/freqtrade-docker# docker network inspect bot_1 | grep '"Gateway"' | head -n 1 "Gateway": "172.23.0.1" root@DESKTOP-74LHUDF:/mnt/e/Python/freqtrade-docker# docker network inspect bot_2 | grep '"Gateway"' | head -n 1 "Gateway": "172.24.0.1" root@DESKTOP-74LHUDF:/mnt/e/Python/freqtrade-docker# docker network inspect bot_3 | grep '"Gateway"' | head -n 1 "Gateway": "172.25.0.1" root@DESKTOP-74LHUDF:/mnt/e/Python/freqtrade-docker# docker network inspect bot_4 | grep '"Gateway"' | head -n 1 "Gateway": "172.26.0.1" root@DESKTOP-74LHUDF:/mnt/e/Python/freqtrade-docker# docker network inspect bot_5 | grep '"Gateway"' | head -n 1 "Gateway": "172.27.0.1" root@DESKTOP-74LHUDF:/mnt/e/Python/freqtrade-docker# docker network inspect bot_6 | grep '"Gateway"' | head -n 1 "Gateway": "172.28.0.1" root@DESKTOP-74LHUDF:/mnt/e/Python/freqtrade-docker# docker network inspect bot_7 | grep '"Gateway"' | head -n 1 "Gateway": "172.29.0.1" root@DESKTOP-74LHUDF:/mnt/e/Python/freqtrade-docker# docker network inspect bot_8 | grep '"Gateway"' | head -n 1 "Gateway": "172.30.0.1"
Proxy的IP为172.x.0.2,Freqtrade的IP暂时无法确定。
已排查现象
- 执行
docker exec -it <container_name> ping google.com可以确认容器能正常访问公网,也能ping通binance-proxy容器,但不管是宿主机还是Freqtrade容器都无法httping通代理服务。 - 已使用
docker inspect、docker network inspect命令排查,也通过docker exec -it ... /bin/bash进入容器查看ifconfig和iptables配置,均无异常,ping通信完全正常。 - 仅有第一个机器人可以正常运行,其余配置相同的机器人无法启动,对比正常、异常的proxy和Freqtrade容器配置无差异。
- 将ccxt的json配置中的地址改为网关IP(格式为
172.x.0.1:809x/api/v3)时,不会出现连接报错,但第二个机器人修改成同样配置后会报('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))错误。
相关配置
服务启动脚本
#!/bin/bash cd /mnt/e/Python/freqtrade-docker/bot_2 docker run -w="/mnt/e/Python/freqtrade-docker/bot_2" -d --name proxy_2 --net bot_2 -p 8092:8092 nightshift2k/binance-proxy:latest docker-compose up -d
docker-compose.yml配置
--- version: '3' services: freqtrade: image: freqtradeorg/freqtrade:stable restart: unless-stopped container_name: freqtrade_2 volumes: - "./user_data:/freqtrade/user_data" ports: - "127.0.0.1:8082:8082" networks: - default command: > trade --logfile /freqtrade/user_data/logs/freqtrade.log --db-url sqlite:////freqtrade/user_data/tradesv3.sqlite --config /freqtrade/user_data/config.json --strategy xxx networks: default: external: true name: bot_2
核心疑问
- 有没有办法可以阻止机器人连接失败时自动重启?
- 还可以尝试哪些手段排查问题?
解决方案
禁止容器自动重启方法
直接修改docker-compose.yml中freqtrade服务的restart配置,将restart: unless-stopped改为restart: "no"即可;如果需要临时调试不修改配置,启动时加--restart no参数覆盖原有配置即可,容器崩溃后就不会自动重启,方便进入容器调试、查看日志。
问题排查手段
- 先确认binance-proxy的监听地址:默认binance-proxy可能只监听容器内127.0.0.1地址,导致同网络其他容器无法访问,启动proxy时添加
--listen 0.0.0.0:8092参数,强制监听所有网卡接口即可。 - 端口连通性测试:用
nc -zv 172.x.0.2 8092代替httping测试端口是否开放,ping通仅代表三层网络连通,不代表四层端口正常开放,httping不通大概率是服务未监听对应端口或者防火墙拦截。 - 查看proxy容器日志:执行
docker logs -f proxy_2查看proxy启动是否报错,是否收到Freqtrade的请求、返回的状态码是什么。 - 检查端口冲突:每个bot的proxy都映射了宿主机的809x端口,确认启动新proxy时没有端口占用,执行
netstat -tulpn | grep 8092即可查看宿主机端口是否被其他进程占用。 - 静态IP配置修复:要给容器配置静态IP需要在创建Docker网络时指定子网范围,比如
docker network create --subnet=172.24.0.0/16 bot_2,这样创建的网络才有固定网关,你之前docker inspect看不到网关就是因为创建网络时没有指定子网,是Docker自动分配的。 - 改用服务名访问:不要用固定IP访问proxy,直接用容器名作为域名访问,比如proxy的容器名叫proxy_2,同网络的freqtrade容器里直接访问
http://proxy_2:8092/api/v3即可,Docker自带DNS解析,比固定IP更稳定。
内容的提问来源于stack exchange,提问作者z3nth10n
相关产品推荐
相关产品推荐

