Python 在不同容器上运行的flask应用程序之间的连接

Python 在不同容器上运行的flask应用程序之间的连接,python,docker,flask,python-requests,linux-containers,Python,Docker,Flask,Python Requests,Linux Containers,我有两个烧瓶应用程序在不同的容器上运行。当我尝试从一个容器向另一个容器发出API请求时,会出现以下错误: HTTPConnectionPool(主机=0.0.0.0',端口=5001):url:/(由NewConnectionError(“:无法建立新连接:[Errno 111]连接被拒绝”)导致超过最大重试次数 烧瓶附件1: app.route("/", methods=["GET"]) @cross_origin(supports_credentials=True) def ads():

我有两个烧瓶应用程序在不同的容器上运行。当我尝试从一个容器向另一个容器发出API请求时,会出现以下错误:

HTTPConnectionPool(主机=0.0.0.0',端口=5001):url:/(由NewConnectionError(“:无法建立新连接:[Errno 111]连接被拒绝”)导致超过最大重试次数

烧瓶附件1:

app.route("/", methods=["GET"])
@cross_origin(supports_credentials=True)
def ads():
    r=requests.get('http://0.0.0.0:5001/',verify=False)
    return jsonify(r.text)
烧瓶附件2:

app.route("/", methods=["GET"])
@cross_origin(supports_credentials=True)
def add2():
    return jsonify('Success!')
app1的Docker文件:

FROM alpine:latest
RUN apk add --no-cache python3-dev \
    && pip3 install --upgrade pip
WORKDIR /
COPY . .
RUN pip3 --no-cache-dir install -r requirements.txt                                                                            
EXPOSE 5000
ENTRYPOINT  ["python3"]
CMD ["app.py","--host", "0.0.0.0"]
app2的Docker文件:

FROM alpine:latest
RUN apk add --no-cache python3-dev \
    && pip3 install --upgrade pip
WORKDIR /
COPY . .
RUN pip3 --no-cache-dir install -r requirements.txt                                                                            
EXPOSE 5001
ENTRYPOINT  ["python3"]
CMD ["app.py","--host", "0.0.0.0"]
使用的docker命令有:

docker run -p 5000:5000 app1
docker run -p 5001:5001 app2

如何在不使用docker compose的情况下解决此错误?

请尝试使用您的IPv4地址。它会起作用的

app.route("/", methods=["GET"])
@cross_origin(supports_credentials=True)
def ads():
    r=requests.get('192.168.10.7:5001/',verify=False)
    return jsonify(r.text)
您可以在您的计算机上找到您的ipv4,

或者您可以使用ifconfig

从终端获取,并将两个容器连接到终端

停止并删除两个容器。(这是一项非常常规的任务,尤其是对于此类更改;您应该确保容器文件系统中没有实际存储的数据,因为它将丢失。)然后创建网络,并创建两个容器,附加到该网络,并使用显式名称:

docker network create app
docker run --net app --name app1 -p 5000:5000 app1
docker run --net app --name app2 -p 5001:5001 app2
现在,这两个容器将能够使用它们的
--name
作为主机名到达另一个容器。你可以打电话

requests.get('http://app2:5001/')
为了支持在Docker和非Docker环境中工作,我建议将此值设置为可配置的。您可以将其默认为
localhost
类型地址,您可以在Docker之外运行这两个容器

app2\u url=os.environ.get('app2\u url','http://localhost:5001')
requests.get(app2\u url)
docker运行-附录2http://app2:5001/'附件1

(Docker Compose在您开始构建相关的
Docker run
命令时开始显得很有吸引力;它主要只是相同内容的声明性YAML格式。但实际上并不需要。)

0.0.0
不是有效的IP,您需要获取另一个容器的主机名才能与之通信it@FranciscoCouzo我正在本地机器上运行这两个容器。我还尝试了localhost而不是0.0.0.0,但仍然得到了相同的结果error@Chetanrns,无论您是否在本地计算机上运行它们都是无关紧要的。您永远无法向
0.0.0.0
发出请求。尤其是在Docker环境中,IP地址很难定期查找和更改;试图找到它们根本不是最好的做法。(更好的答案是解释如何找到它以及为什么需要它。)你的方法是对的,但他问我如何调用其他容器,他正在尝试使用localhost等等。这就是为什么我告诉他使用你的ipv4