如何将烧瓶容器与 mysql 容器连接
How to connect a flask container with a mysql container
我已经有一个名为 "mysqlDemoStorage" 运行ning 的 mysql 容器,将端口 3306 暴露给 0.0.0.0:3306。我还有一个 flask 应用程序,它提供了一个登录页面和 table-显示页面。 Flask 应用程序在主机中运行良好。登录页面连接到 mysql 容器中的 "user" table,table-显示页面连接到另一个 table 保存所有要显示的数据。
我用来创建mysql容器的docker-compose文件如下:
version: '3'
services:
mysql:
container_name: mysqlDemoStorage
environment:
MYSQL_ROOT_PASSWORD: "demo"
command:
--character-set-server=utf8
ports:
- 3306:3306
image: "docker.io/mysql:latest"
restart: always
现在我想 docker 化 flask 应用程序,这样我仍然可以从主机查看该应用程序。 mysql容器详细信息如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c48955b3589e mysql:latest "docker-entrypoint.s…" 13 days ago Up 49 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysqlDemoStorage
我写的flask app的docker文件如下:
FROM python:latest
WORKDIR /storage_flask
ADD . /storage_flask
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python","run.py"]
可以成功构建flask镜像,但是当我运行镜像时,我无法加载页面。我认为导致问题的一点是init.py文件启动flask app,如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
app = Flask(__name__)
app.config['SECRET_KEY'] = 'aafa4f8047ce31126011638be8530da6'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@localhost:3306/storage'
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)
login_manager.login_view = "login"
login_manager.login_message_category = 'info'
from storage_flask import routes
我在考虑将 mysql 容器的 IP 作为数据库连接的配置字符串传递给 flask 容器。但我不确定该怎么做。
有人可以帮助解决问题吗?谢谢
更改此行
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@localhost:3306/storage'
到
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@mysql:3306/storage'
您还需要确保两个容器都连接到同一个网络,为此您需要将 docker-compose 文件更新为类似于下面的文件
version: '3.7'
networks:
my_network_name:
name: my_network_name
external: false
services:
mysql:
container_name: mysqlDemoStorage
environment:
MYSQL_ROOT_PASSWORD: "demo"
command:
--character-set-server=utf8
ports:
- 3306:3306
image: "docker.io/mysql:latest"
restart: always
networks:
- my_network_name
第二个文件
version: '3.7'
networks:
my_network_name:
name: my_network_name
external: true
services:
python_app:
container_name: pythonDemoStorage
ports:
- 5000:5000
image: "Myimage"
restart: always
networks:
- my_network_name
我已经有一个名为 "mysqlDemoStorage" 运行ning 的 mysql 容器,将端口 3306 暴露给 0.0.0.0:3306。我还有一个 flask 应用程序,它提供了一个登录页面和 table-显示页面。 Flask 应用程序在主机中运行良好。登录页面连接到 mysql 容器中的 "user" table,table-显示页面连接到另一个 table 保存所有要显示的数据。 我用来创建mysql容器的docker-compose文件如下:
version: '3'
services:
mysql:
container_name: mysqlDemoStorage
environment:
MYSQL_ROOT_PASSWORD: "demo"
command:
--character-set-server=utf8
ports:
- 3306:3306
image: "docker.io/mysql:latest"
restart: always
现在我想 docker 化 flask 应用程序,这样我仍然可以从主机查看该应用程序。 mysql容器详细信息如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c48955b3589e mysql:latest "docker-entrypoint.s…" 13 days ago Up 49 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysqlDemoStorage
我写的flask app的docker文件如下:
FROM python:latest
WORKDIR /storage_flask
ADD . /storage_flask
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python","run.py"]
可以成功构建flask镜像,但是当我运行镜像时,我无法加载页面。我认为导致问题的一点是init.py文件启动flask app,如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
app = Flask(__name__)
app.config['SECRET_KEY'] = 'aafa4f8047ce31126011638be8530da6'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@localhost:3306/storage'
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)
login_manager.login_view = "login"
login_manager.login_message_category = 'info'
from storage_flask import routes
我在考虑将 mysql 容器的 IP 作为数据库连接的配置字符串传递给 flask 容器。但我不确定该怎么做。 有人可以帮助解决问题吗?谢谢
更改此行
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@localhost:3306/storage'
到
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@mysql:3306/storage'
您还需要确保两个容器都连接到同一个网络,为此您需要将 docker-compose 文件更新为类似于下面的文件
version: '3.7'
networks:
my_network_name:
name: my_network_name
external: false
services:
mysql:
container_name: mysqlDemoStorage
environment:
MYSQL_ROOT_PASSWORD: "demo"
command:
--character-set-server=utf8
ports:
- 3306:3306
image: "docker.io/mysql:latest"
restart: always
networks:
- my_network_name
第二个文件
version: '3.7'
networks:
my_network_name:
name: my_network_name
external: true
services:
python_app:
container_name: pythonDemoStorage
ports:
- 5000:5000
image: "Myimage"
restart: always
networks:
- my_network_name