如何将烧瓶容器与 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