docker - 如何将烧瓶容器与mysql容器连接起来
问题描述
我已经运行了一个名为“mysqlDemoStorage”的 mysql 容器,将端口 3306 暴露给 0.0.0.0:3306。我还有一个烧瓶应用程序,它提供了登录页面和表格显示页面。烧瓶应用程序在主机中运行良好。登录页面连接到 mysql 容器中的“用户”表,而表显示页面连接到另一个表,其中包含要显示的所有数据。我用来创建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
现在我想 dockerize 烧瓶应用程序,以便我仍然可以从主机查看应用程序。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的dockerfile如下:
FROM python:latest
WORKDIR /storage_flask
ADD . /storage_flask
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python","run.py"]
烧瓶图像可以成功构建,但是当我运行图像时,我无法加载页面。我认为导致问题的一点是用于启动烧瓶应用程序的init .py 文件,如下所示:
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 作为 DB 连接的配置字符串传递给烧瓶容器。但我不知道该怎么做。有人可以帮助解决问题吗?谢谢
解决方案
change this line
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@localhost:3306/storage'
to
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:demo@mysql:3306/storage'
You also need to make sure that both containers are connected to the same network, for that you need to update your docker-compose file to be something like the below file
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
second file
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
推荐阅读
- firebase - 可以拦截直接从客户端调用 Firebase https 函数吗?
- angular - 计算购物车中的总数在角度 6 中不起作用
- c++ - 静态链接库时,出现链接器错误:找不到 -lgcc_s
- php - Worpdress 选择框选择要显示的帖子和数量
- android - 如何设置饼图的标签颜色?
- python - ModuleNotFoundError:没有名为“widget_tweaks”的模块
- ios - 应用内购买退款
- java - 使用Spring Data Common发布域事件时如何处理没有存储库的聚合根
- sql - 如何测试返回空记录的子查询
- r - 为交叉验证指定 nfolds 时出现 h2o 深度学习错误