mysql - 如何使用 sql-alchemy 从 Flask 应用程序连接到 mysql docker 容器

标签 mysql docker flask

我有一个 flask 应用程序。该应用程序在本地运行。我已经拉取了 mysql:5.7 并且它正在运行。我想从 Flask 应用程序在 mysql:5.7 容器内创建一个数据库并使用它。我正在使用 sql_alchemy。

我已将 uri 指定为

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@172.17.0.2:4000/document_generator'

其中 root 和 root 分别是 mysql 用户名和密码。 172.17.0.2是mysql容器的ip地址。我已经使用运行容器

docker run  -p 4000:4000  -e MY_SQL_ROOT_PASSWORD=root mysql:5.7

我已经暴露了端口 4000。但是,当我获取容器并尝试时

show global variables like 'port';

它提供了 3306 作为端口。

我尝试使用 SQL_ALCHEMY_URI 中的两个端口,但它们都无法创建数据库。我还尝试将 mysql://更改为 mysql+pymsql://。即使这样也有效。 我已经在 models.py 中编写了建表代码

class Users(db.Model):
__tablename__ = 'users'
username = db.Column(db.String(128), nullable=True)
password = db.Column(db.String(256), nullable=False)
private_id = db.Column(db.String(128), primary_key=True)

我希望在运行 Flask 应用程序时在 mysql 容器中创建数据库。我对 docker-compose 不了解。任何帮助都会有很大帮助。提前致谢。

最佳答案

您的 docker run 命令将要发布的端口指定为 4000:4000

: 的左侧是 4000,这是您本地计算机上的端口,这没问题。

但是:的右侧也是4000是运行MySQL的容器内的端口。 MySQL 的默认端口是 3306,而不是 4000,因此您尝试通过错误的端口访问 MySQL。

要解决这个问题:

  1. 停止 Docker 容器
# Show all the running containers. The last column should be the container name.
$ docker ps

# Stop and remove the container
$ docker rm -f <container name>
  • 使用正确的端口重新创建容器
  • $ docker run -p 4000:3306 -e MY_SQL_ROOT_PASSWORD=root mysql:5.7 
    

    现在应该可以工作了。

    奖金

    Docker 也在本地主机上公开容器。您还可以访问 localhost:4000 上的数据库。

    关于mysql - 如何使用 sql-alchemy 从 Flask 应用程序连接到 mysql docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59420428/

    相关文章:

    docker - docker:无法连接到Mac OS X上的Docker守护程序

    python - Flask/Flask_restful 自定义 404 错误信息

    python - 如何在flask中使用after_request关闭数据库连接和python?

    php - 如何知道php文件是否正在运行?

    php - MySQL Workbench 能否在查询结果网格中显示选中的行数?

    php - 显示mysql数据库其他表的数据

    java - 如何在java或jsp中对查询结果应用where条件

    Docker - 无法构建简单的 dotnet webapi 容器 : COPY failed: stat/var/lib/docker/overlay2 error

    node.js - 容器IP随机

    javascript - 在 jQuery.post 上,我收到消息 : The method GET is not allowed for the requested URL