Я пытаюсь создать простое приложение To do с docker-compose, имеющим 3 контейнера: один API Flask Rest с sqlalchemy и marshmallow, один PHP для вызова моего Rest-Api и одну базу данных 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)
И я не могу вызвать остальные API из моего php-контейнера.
Вот код с важными строками:
мой 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
мой отдых-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)
как я называю rest-api из php:
<?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');
?>
Любая помощь приветствуется, и правильный ответ помечается как правильный.