繁体   English   中英

无法从 docker-compose 上的 python 连接到 MySQL

[英]Cannot connect to MySQL from python on docker-compose

我正在尝试为使用 mysql 运行的烧瓶应用程序构建一个 docker-compose。 问题是:我的烧瓶无法访问 mysql(都在 docker-compose 中)并不断返回此问题: pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")

所以我决定编写一个简单的烧瓶应用程序并将连接复制到mysql。 docker-compose 上的 Flask 应用程序单独运行良好,mysql 也运行良好,因为我可以在 dbeaver 中编写查询。 但是,当我尝试在脚本中连接到 mysql 时,它会引发错误: connection = pymysql.connect(host='127.0.0.1')与我上面提到的类似错误

代码在遇到host=127.0.0.1时会立即中断。

这是我的 app.py:

from flask import Flask
import pymysql

app = Flask(__name__)
    
@app.route('/')
def index():
    return '<h1>Login</h1>'
    
if __name__ == '__main__':
    connection = pymysql.connect(host='127.0.0.1',
                                 user='root',
                                 password='password',
                                 port=33061,
                                 cursorclass=pymysql.cursors.DictCursor)
    cur = connection.cursor()
    cur.execute(''' SELECT * FROM data_warehouse.ofactory_results''')
    order_no = cur.fetchone()
    print(order_no)
    
    print('STARTTTTTTT!')
    app.run(debug=True)

这是我的码头工人撰写:

version: "3.9"
    
services:
  app:
    build:
      context: .
    ports:
      - 5000:5000
    
  mysql_db:
    container_name: mysql_db
    image: mariadb:latest
    restart: always
    ports:
      - "0.0.0.0:33061:3306"
    environment: 
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=data_warehouse
      - MYSQL_USER=debezium
          - MYSQL_PASSWORD=debezium
     volumes:
       - ./mysql:/var/lib/mysql
       - ./mysql/my.cnf:/etc/mysql/my.cnf

这是我的码头文件:

FROM python:3.9
COPY requirements.txt .     
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]

这是错误:

Traceback (most recent call last):
prep-app-1  |   File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 613, in connect
prep-app-1  |     sock = socket.create_connection(
prep-app-1  |   File "/usr/local/lib/python3.9/socket.py", line 844, in create_connection
prep-app-1  |     raise err
prep-app-1  |   File "/usr/local/lib/python3.9/socket.py", line 832, in create_connection
prep-app-1  |     sock.connect(sa)
prep-app-1  | ConnectionRefusedError: [Errno 111] Connection refused
prep-app-1  | 
prep-app-1  | During handling of the above exception, another exception occurred:
prep-app-1  | 
prep-app-1  | Traceback (most recent call last):
prep-app-1  |   File "//app.py", line 10, in <module>
prep-app-1  |     connection = pymysql.connect(host='127.0.0.1',
prep-app-1  |   File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 353, in __init__
prep-app-1  |     self.connect()
prep-app-1  |   File "/usr/local/lib/python3.9/site-packages/pymysql/connections.py", line 664, in connect
prep-app-1  |     raise exc
prep-app-1  | pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)")
prep-app-1 exited with code 1

docker 容器内的 localhost != 主机的 localhost。

您可以使用:

connection = pymysql.connect(host='mysql_db',
                             user='root',
                             password='password',
                             port=3306,
                             cursorclass=pymysql.cursors.DictCursor)

注意mysql_db这是您的数据库服务的名称。 Docker,在内部会将该名称解析为 docker 网络中的容器 IP 地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM