簡體   English   中英

Flask + MySQL + PHP + Docker-Compose =痛苦

[英]Flask + MySQL + PHP + Docker-Compose = Pain

我正在嘗試使用docker-compose構建一個具有3個容器的簡單的To do應用程序:一個帶有sqlalchemy和棉花糖的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容器中調用我的rest api。 以下是重要行的代碼:

我的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');
 ?>

感謝您的幫助,並將正確答案標記為正確答案。

您需要的不是從SQLALCHEMY_DATABASE_URI中的“ @db”,而是從服務器可以找到db容器的實際地址。

例如,您可以找出您的docker machine 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地址。

我通過將最新的MySQL版本映像降級到5.7解決了這個問題:

mysql:5.7

我沒有任何線索為什么這應該工作,因為返回的錯誤必須是某種東西,例如我的碼頭工人及其網絡配置錯誤,並且與MySQL無關。 也許這可以幫助某人。

編輯:在嘗試連接之前,始終檢查您的數據庫容器是否已啟動,因為Docker會同時啟動所有容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM