使用docker-compose从Flask应用程序连接到MySQL

我有一个使用Flask和MySQL的应用程序。 应用程序不会连接到Flask应用程序的MySQL容器,但可以使用Sequel Pro以相同的凭据访问它。

Docker撰写文件

version: '2' services: web: build: flask-app ports: - "5000:5000" volumes: - .:/code mysql: build: mysql-server environment: MYSQL_DATABASE: test MYSQL_ROOT_PASSWORD: root MYSQL_ROOT_HOST: 0.0.0.0 MYSQL_USER: testing MYSQL_PASSWORD: testing ports: - "3306:3306" 

Docker文件的MySQL

MySQL的test.dump文件将从test.dump文件添加模式。

 FROM mysql/mysql-server ADD test.sql /docker-entrypoint-initdb.d 

Flask的Docker文件

 FROM python:latest COPY . /app WORKDIR /app RUN pip install -r requirements.txt ENTRYPOINT ["python"] CMD ["app.py"] 

起点app.py

 from flask import Flask, request, jsonify, Response import json import mysql.connector from flask_cors import CORS, cross_origin app = Flask(__name__) def getMysqlConnection(): return mysql.connector.connect(user='testing', host='0.0.0.0', port='3306', password='testing', database='test') @app.route("/") def hello(): return "Flask inside Docker!!" @app.route('/api/getMonths', methods=['GET']) @cross_origin() # allow all origins all methods. def get_months(): db = getMysqlConnection() print(db) try: sqlstr = "SELECT * from retail_table" print(sqlstr) cur = db.cursor() cur.execute(sqlstr) output_json = cur.fetchall() except Exception as e: print("Error in SQL:\n", e) finally: db.close() return jsonify(results=output_json) if __name__ == "__main__": app.run(debug=True,host='0.0.0.0') 

当我对http://localhost:5000/使用REST客户端执行GET请求时,我得到一个有效的响应。

http://localhost:5000/api/getMonths上的GET请求会给出错误消息:

 mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '0.0.0.0:3306' (111 Connection refused) 

当在Sequel Pro上使用相同的证书时,我能够访问数据库。 在这里输入图像说明

请咨询我如何从Flask应用程序连接MySQL容器。 这是我第一次起诉Docker,如果这是我的一个愚蠢的错误,请原谅我。

改变这一点

 return mysql.connector.connect(user='testing', host='0.0.0.0', port='3306', password='testing', database='test') 

 return mysql.connector.connect(user='testing', host='mysql', port='3306', password='testing', database='test') 

您的代码在容器中运行,而不是在主机上运行。 所以你需要提供一个可以在集装箱networking内到达的地址。 对于docker-compose每个服务都可以使用它的名字到达。 所以在你的它是mysql因为这是您用于服务的名称