flask+mysql+php+docker compose=痛苦

wlp8pajw  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(768)

我试图用docker compose构建一个简单易用的应用程序,它有3个容器:一个带有sqlalchemy和marshmallow的flask rest api,一个用于调用我的rest api的php和一个mysql数据库。我得到的错误是:

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, 
"Can't connect to MySQL server on 'db' ([Errno 111] Connection refused)") 
(Background on this error at: http://sqlalche.me/e/e3q8)

我不能从php容器调用restapi。下面是代码和重要的行:
我的docker-compose.yml:

version: '3.1' #compose version

services: 
flaskapi-service:
 build: 
  context: ./restapi #relative to docker-compose file directory
  dockerfile: DOCKERFILE
 volumes: 
  - ./restapi:/usr/src/app #mounting
 ports:
  - 5001:5001 #host:container
 depends_on:
  - db
 restart: on-failure

db:
 image: mysql:latest
 restart: always
 environment:
  MYSQL_USER: username
  MYSQL_PASSWORD: password
  MYSQL_DATABASE: todo
  MYSQL_ROOT_PASSWORD: password
 ports:
   - "3306:3306"

php-page:
 build:
  context: ./frontend
  dockerfile: DOCKERFILE
 volumes:
  - ./frontend:/var/www/html #mount
 ports: 
  - 5002:80 #host:container
 depends_on: 
  - flaskapi-service

我的rest api:

from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import pymysql

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 
'mysql+pymysql://username:password@db:3306/todo'

# order matters: ORM before serialization tool

db = SQLAlchemy(app)
ma = Marshmallow(app)

我如何从php调用rest api:

<?php
    $date_time = date('Y-m-d H:i:s');
    $data = array(
        'description' => $_POST['description'],
        'deadline' => $_POST['deadline'],
        'createdAt' => $date_time,
        'finished' => 'false'
    );

    $encodedJSON = json_encode($data);

    //Initiate cURL-handle
    $ch = curl_init();

    curl_setopt_array($ch, array(
        CURLOPT_URL => 'http://flaskapi-service/todo',
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => $encodedJSON,
        CURLOPT_HTTPHEADER => array('Content-Type: application/json')
    ));

    $result = curl_exec($ch);
    echo $result;
    curl_close($ch);
    header('Location: index.php');
 ?>

感谢您的帮助,并将正确答案标记为正确。

vd8tlhqk

vd8tlhqk1#

在sqlalchemy\u数据库\u uri中不使用“@db”,而是需要从服务器中找到db容器的实际地址。
例如,您可以找出docker机器ip正在使用什么

$ docker-machine ip

然后替换uri中的ip。例如

'mysql+pymysql://username:password@192.168.0.123:3306/todo'

如果所有容器都在同一台机器上,那么它们甚至可能在同一台主机上,请尝试一下:

'mysql+pymysql://username:password@localhost:3306/todo'

在本文中,您可以找到其他方法来确定mysql示例的ip地址。

a6b3iqyw

a6b3iqyw2#

我通过将最新mysql版本图像降级到5.7来解决这个问题:

mysql:5.7

我不知道为什么这应该工作,因为返回的错误一定是什么,例如我的docker和它的网络配置错误,不应该与mysql无关。也许这对某人有帮助。
编辑:由于docker正在同时启动所有容器,所以在尝试连接之前,始终检查数据库容器是否已启动。

相关问题