![驱动程序中发生异常:SQLSTATE[HY000] [2002] 连接被拒绝 - docker - symfony](https://linux22.com/image/204952/%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%8F%91%E7%94%9F%E5%BC%82%E5%B8%B8%EF%BC%9ASQLSTATE%5BHY000%5D%20%5B2002%5D%20%E8%BF%9E%E6%8E%A5%E8%A2%AB%E6%8B%92%E7%BB%9D%20-%20docker%20-%20symfony.png)
我的代码(symfony 5.4)无法将数据保存到数据库。这是我的设置:-
docker-compose.yaml
...
#MySQL Service
db:
image: mysql:5.7.22
container_name: db
restart: unless-stopped
tty: true
ports:
- "3316:3306"
environment:
MYSQL_DATABASE: pink
MYSQL_ROOT_PASSWORD: password
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- dbdata:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/my.cnf
networks:
- app-network
...
.env
DATABASE_URL="mysql://root:password@db:3316/pink"
产品控制器.php
#[Route('/product/create', name: 'product_create')]
public function createProduct(ManagerRegistry $doctrine): Response
{
$entityManager = $doctrine->getManager();
$product = new Product();
$product->setName('Keyboard');
$product->setPrice(1999);
$product->setDescription('Ergonomic and stylish!');
// tell Doctrine you want to (eventually) save the Product (no queries yet)
$entityManager->persist($product);
// actually executes the queries (i.e. the INSERT query)
$entityManager->flush();
return new Response('Saved new product with id '.$product->getId());
}
数据库(docker)容器已启动并运行良好。这是一个测试,成功了:-
mysql --host=127.0.0.1 --user=root --password=password pink --port=3316 --ssl-mode=disabled
在我的.env
文件中,我已将字符串替换127.0.0.1
为上面的 docker 容器名称:db
。
有什么想法吗?
答案1
结果我们需要使用默认端口号进行数据库连接,即3306
。完整的数据库字符串如下所示:
DATABASE_URL="mysql://root:password@db:3306/pink"
我仍然不完全理解 docker 容器中端口号的内部/外部和可见性的概念
db:
...
ports:
- "3316:3306"
答案2
我在使用 Docrine WSL2 时遇到同样的问题,我必须添加这一行/etc/hosts
127.0.0.1 db
.env
并在文件中使用此配置:
DATABASE_URL="mysql://root:password@db:3306/my_database_name?serverVersion=8.0.3&charset=utf8mb4"