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

时间:2019-05-23 11:48:35

标签: python mysql python-3.x docker

我正在尝试使用python程序连接到mysql db。在本地运行时有效。

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

Python_code:

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

docker-compose:

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因错误而失败:

  

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

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

3 个答案:

答案 0 :(得分:1)

尝试使用容器端口3306-

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

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

 depends_on:
    - db

答案 1 :(得分:1)

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

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

 function InitializeConfetti() {
              canvas.style.display = 'block';
              particles = [];
              animationComplete = false;
              for (var i = 0; i < mp; i++) {
                  var particleColor = particleColors.getColor();
                  particles.push(new confettiParticle(particleColor));
              }
              setTimeout(function() {
                StartConfetti();
              }, 29000);


          }

答案 2 :(得分:1)

我建议您退出应用程序,以防它无法连接到MySQL并将重启策略设置为始终,因为depends_on不能保证app启动时MySQL会完全启动,但是在那里很高兴。

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)