【问题标题】:Cannot connect to MySQL (python MySql-Connector) when in docker container在 docker 容器中无法连接到 MySQL(python MySql-Connector)
【发布时间】:2020-02-11 14:17:00
【问题描述】:

我有一个基于 Python Flask 的应用程序需要连接到数据库

version: "3.7"

networks:
  localdev:
    driver: bridge

services:
  sysman-db:
    image: mysql:8.0
    container_name: sysman-db
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - "4000:3306"
    environment:
      MYSQL_ROOT_PASSWORD: xxxxx
    volumes:
      - ./database/docker:/etc/mysql/conf.d
      - ./database/schema.sql:/docker-entrypoint-initdb.d/dump0.sql
    networks:
      - localdev

  sysman:
    build:
      context: .
      dockerfile: Dockerfile.sysman
    container_name: sysman
    depends_on:
      - sysman-db
    ports:
      - "3030:3030"
    networks:
      - localdev
    links:
      - lsm-db

Flask 应用程序连接到 MySql,它有一个重试方法,因为 Docker 在数据库初始化完成之前启动了 sysman。

即使数据库启动了,我仍然得到:

sysman    | 2020-02-11 13:55:08 [ERROR] Unable to connect to db, reason: 2003: Can't connect to MySQL server on 'sysman-db:4000' (111 Connection refused)
sysman    | 2020-02-11 13:55:18 [ERROR] Unable to connect to db, reason: 2003: Can't connect to MySQL server on 'sysman-db:4000' (111 Connection refused)
sysman    | 2020-02-11 13:55:28 [ERROR] Unable to connect to db, reason: 2003: Can't connect to MySQL server on 'sysman-db:4000' (111 Connection refused)
sysman    | 2020-02-11 13:55:38 [ERROR] Unable to connect to db, reason: 2003: Can't connect to MySQL server on 'sysman-db:4000' (111 Connection refused)

数据库连接是:

dbConfig = { 'host' : '127.0.0.1', 'port' : 4000, 'user' : user, 
             'password' : password, 'database' : database }
connPool = mysql.connector.pooling.MySQLConnectionPool(pool_name='myPool',
                                                       pool_size=3,
                                                       pool_reset_session=True,
                                                       **dbConfig)

如果我自己启动 MySql 容器,然后使用 mysql -u root -p -P 4000 我可以连接。

【问题讨论】:

    标签: mysql docker-compose mysql-connector


    【解决方案1】:

    您的 sysman 容器应该使用 sysman-db:3306(而不是 4000)连接到数据库容器。请记住,这是 2 个服务之间的通信,因此已发布的端口不计算在内。

    【讨论】:

    • 谢谢你,我一直在用头撞到众所周知的砖墙上:(
    • @LucyThomas 很高兴我能帮上忙;)希望解释也足够清楚。
    • 是的,我犯了一个致命错误,即假设它是如何工作的:P
    【解决方案2】:

    您正在尝试连接不运行 mysqld 的烧瓶容器的本地主机。已发布端口的 4000 个端口计数。 2 个容器应该通过 3306 端口通信

    试试这个:

    dbConfig = { 'host' : 'sysman-db', 'port' : 3306, 'user' : user, 
                 'password' : password, 'database' : database }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-26
      • 2016-07-22
      • 2020-12-30
      • 2020-07-29
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      相关资源
      最近更新 更多