繁体   English   中英

无法使用python访问mysql db(都在不同的容器上运行)

[英]unable to access mysql db using python (both running on different containers)

我正在尝试使用python程序连接到mysql db。 在本地运行时,它可以工作。

但是在对我创建的应用程序进行docker化时,一个容器用于python代码,另一个容器用于mysql db,以这种方式运行时,它无法连接。

Python_code:

db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)

泊坞窗 - 撰写:

version: "3"
  services:
    app:
      image: app:latest
      links:
        - db
      ports:
        - "8001:8081"
      environment:
        - DB_HOST= db

    db:
      image: mysql:5.7.26
      restart: always
      environment:
        MYSQL_DATABASE: 'my_db'
        MYSQL_USER: 'docker_root'
        MYSQL_PASSWORD: 'password'
        MYSQL_ROOT_PASSWORD: 'password'
      ports:
        - "3306:3306"
      volumes:
        - ./DB_config/:/etc/mysql/mysql.conf.d

并且docker-compose up因eroor而失败:

pony.orm.dbapiprovider.OperationalError:(2003年,“无法连接到'db'上的MySQL服务器([Errno 111]连接被拒绝)”)

我要去哪里错了? 请指教!

尝试使用容器端口3306

db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)

另外,添加depends_on属性,您可以删除links属性-

 depends_on:
    - db

您可以使用已接受答案中提到的depends_on标志。 如果不能解决您的问题,请使用此方法。

启动容器后,您的服务器将尝试连接到数据库服务器。 有时数据库服务器可能需要一些时间才能启动,并且在此窗口中,如果服务器尝试连接到数据库服务器,它将面临问题。 如果连接失败,请尝试添加逻辑以在几秒钟后重新连接数据库服务器。

try{
   connectToDatabase();
   }catch(error){
   waitForHalfMinute();
   connectToDatabase();
}

我建议您在无法连接到MySQL的情况下退出您的应用程序,并将重新启动策略设置为always,因为depends_on不能保证在app启动时MySQL会完全启动,但是最好在app中安装它。

version: "3"
  services:
    app:
      image: app:latest
      restart: always
      links:
        - db
      ports:
        - "8001:8081"
      environment:
        - DB_HOST= db
      depends_on:
        - db

    db:
      image: mysql:5.7.26
      restart: always
      environment:
        MYSQL_DATABASE: 'my_db'
        MYSQL_USER: 'docker_root'
        MYSQL_PASSWORD: 'password'
        MYSQL_ROOT_PASSWORD: 'password'
      ports:
        - "3306:3306"
      volumes:
        - ./DB_config/:/etc/mysql/mysql.conf.d

您的应用程序代码应类似于:

try:
    db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)
except:
    # write some logs
    exit(1)

暂无
暂无

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

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