首页 > 解决方案 > 如何将烧瓶容器与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 连接的配置字符串传递给烧瓶容器。但我不知道该怎么做。有人可以帮助解决问题吗?谢谢

标签: dockerflaskdockerfilecontainersmysqlconnection

解决方案


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

推荐阅读