[英]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.