我试图用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');
?>
感谢您的帮助,并将正确答案标记为正确。
2条答案
按热度按时间vd8tlhqk1#
在sqlalchemy\u数据库\u uri中不使用“@db”,而是需要从服务器中找到db容器的实际地址。
例如,您可以找出docker机器ip正在使用什么
然后替换uri中的ip。例如
如果所有容器都在同一台机器上,那么它们甚至可能在同一台主机上,请尝试一下:
在本文中,您可以找到其他方法来确定mysql示例的ip地址。
a6b3iqyw2#
我通过将最新mysql版本图像降级到5.7来解决这个问题:
我不知道为什么这应该工作,因为返回的错误一定是什么,例如我的docker和它的网络配置错误,不应该与mysql无关。也许这对某人有帮助。
编辑:由于docker正在同时启动所有容器,所以在尝试连接之前,始终检查数据库容器是否已启动。