【问题标题】:Can't connect to flask app inside a docker container from host [duplicate]无法从主机连接到 docker 容器内的烧瓶应用程序 [重复]
【发布时间】:2021-09-04 10:46:40
【问题描述】:

我正在尝试通过在我的计算机上运行 docker-compose up 来运行 Flask 应用程序和 mysql 数据库。烧瓶在 5000 端口上运行。

if __name__ == "__main__":
    app.run(port=5000, debug=True)

当我使用docker exec 命令时,docker 容器正常响应。但我无法通过使用 url 得到主机的任何响应:http://localhost:5000

curl -X GET <url> 命令给出以下输出:

curl: (56) Recv failure: Connection reset by peer

docker ps 命令给出以下输出:

CONTAINER ID   IMAGE                      COMMAND                  CREATED             STATUS             PORTS                                NAMES
bffa59c471f6   customer_transaction_app   "/bin/sh -c 'python …"   About an hour ago   Up About an hour   0.0.0.0:5000->5000/tcp               customer_transaction_app_1 
ad60c2830ac0   mysql                      "docker-entrypoint.s…"   About an hour ago   Up About an hour   33060/tcp, 0.0.0.0:32001->3306/tcp   customertransaction_db_host  


                                              

这里是 Dockerfile:

FROM python:3.8 
EXPOSE 5000 
COPY requirements.txt /app/requirements.txt
WORKDIR /app 
RUN pip install -r requirements.txt 
COPY . /app CMD 
python main.py

这是docker-compose.yml 文件:

version: "2"
services:
    app:
        build: ./
        depends_on:
            - db
        ports:
            - "5000:5000"
    db:
        container_name: customertransaction_db_host
        image: mysql
        restart: always
        ports:
            - "32001:3306"
        volumes:
            - customertransaction-db-vol:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: 123456
            MYSQL_DATABASE: customertransaction_db
            MYSQL_USER: user
            MYSQL_PASSWORD: 123456
    
volumes:
    customertransaction-db-vol: {}

这两个容器都位于 docker 网络 customer_transaction_default 中。 docker network inspect 命令创建以下输出:

[
    {
        "Name": "customer_transaction_default",
        "Id": "4b5b20f503af0026a2f1ef185436c9a8e3d9c2ece690e93ece0e6b12f7821edb",
        "Created": "2021-06-20T17:52:15.603679073+05:30",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.24.0.0/16",
                    "Gateway": "172.24.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "ad60c2830ac0f7e270daf03334ea8a8170200e92c2bc43492c378bd1d89cd3ac": {
                "Name": "customertransaction_db_host",
                "EndpointID": "de4597a1f58d711640f71a6169111f9842c7c5d74320825657a2518d07f36504",
                "MacAddress": "02:42:ac:18:00:02",
                "IPv4Address": "172.24.0.2/16",
                "IPv6Address": ""
            },
            "bffa59c471f6762bb802fcee37db356cf2c7a59f4f88192e3546dd10ad9dbb2d": {
                "Name": "customer_transaction_app_1",
                "EndpointID": "a3ded03e28343921d799c0efc334034028821c231e1469d4359cd387c7f43f70",
                "MacAddress": "02:42:ac:18:00:03",
                "IPv4Address": "172.24.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

【问题讨论】:

  • 你能连接到容器内的 Django 应用吗(使用docker exec)?如果不能,则问题是您的 Django 应用程序未正确启动。
  • 烧瓶应用程序运行正常。从使用“docker exec”命令的容器中,当我通过 curl 发送 GET 请求时,我可以从烧瓶应用程序获得正确的响应,并从 MySQL 返回数据。但是从主机我没有得到任何响应。
  • 谢谢。这样就解决了问题。

标签: mysql docker flask docker-compose docker-networking


【解决方案1】:

由于您正在尝试连接 docker 网络中的服务器,因此您应该将用于连接 Mysql 的连接字符串中的主机更改为您愿意连接的容器的名称。

对于您的情况,您必须将 localhost 更改为“customertransaction_db_host”。

【讨论】:

  • 我已经这样做了。这是数据库连接环境变量。 DEV_DATABASE_URI=mysql+mysqlconnector://user:123456@customertransaction_db_host:3306/customertransaction_dbflask 应用运行正常,完美连接 MySQL。从使用“docker exec”命令的容器中,当我通过 curl 发送 GET 请求时,我可以从烧瓶应用程序获得正确的响应,并从 MySQL 返回数据。但是从主机我没有得到任何响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2017-10-18
  • 1970-01-01
  • 2019-07-13
相关资源
最近更新 更多