使用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
因为这是您用于服务的名称