[英]Symfony 5 + Docker: SQLSTATE[HY000] [2002] Connection refused
[英]Symfony + Docker, connection refused
我在 Symfony 中经验丰富,但对 docker 很陌生,我有一个“连接被拒绝的错误”,我无法解决。
很确定这是一个初学者错误,这里的解决方案非常简单......
这是我的docker-compose
文件的内容:
version: '3.2'
services:
cg-demo:
build: docker/cg-demo
container_name: cg-demo
working_dir: /var/www/html
volumes:
- .:/var/www/html
- ./docker/demo/vhost.conf:/etc/apache2/sites-available/000-default.conf:ro
- ./docker/demo/php.ini:/usr/local/etc/php/php.ini:ro
- ~/.ssh:/var/www/.ssh
- ~/.composer:/var/www/.composer
environment:
- SYMFONY_ENV
- DOMAIN_NAME: cg-demo.docker
- VIRTUAL_HOST: cg-demo.docker
depends_on:
- database
env_file: .env
ports:
- 8000:80
database:
image: percona:5.6
ports:
- 3306:3306
expose:
- 3306
container_name: cg-demo-database
volumes:
- /docker/database:/etc/mysql/conf.d
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: demo
tmpfs:
- /var/lib/mysql
- /tmpfs:size=300M
这是基于另一个有效的项目,但我不确定这里发生的一切......
我还有一个 phpmyadmin 容器,这里没有显示。 PhpMyAdmin 正确连接到数据库,并且可以从任何 Web 服务器毫无问题地使用它。 但是,当涉及到 symfony 容器时,我每次尝试使用数据库时都会遇到这个问题:
[Doctrine\DBAL\Exception\ConnectionException]
An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused
[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[HY000] [2002] Connection refused
[PDOException]
SQLSTATE[HY000] [2002] Connection refused
.env
文件中的连接信息如下:
# Database credentials
DATABASE_HOST=database
DATABASE_PORT=3306
DATABASE_USER=root
DATABASE_PASSWORD=root
DATABASE_DB=cg-demo
调用docker ps
给了我这个:
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS NAMES
16a67dadeebb phpmyadmin/phpmyadmin "/run.sh phpmyadmin" 15 minutes ago Up 15 minutes 0.0.0.0:8001->80/tcp cg.phpmyadmin.docker
8bd783aa1dd1 cg_cg-demo "entrypoint.sh apa..." 15 minutes ago Up 15 minutes 0.0.0.0:8000->80/tcp cg-demo
2fc7cd9105ba percona:5.6 "docker-entrypoint..." 15 minutes ago Up 15 minutes (healthy) 3306/tcp cg-database
我已经尝试从演示容器ping database
并且它有效......
编辑 1:
将以下内容添加到数据库容器中:
ports:
- 3306:3306
编辑2:
从所有容器中删除以下内容:
networks:
- default
编辑 3:
我在app/config/config.yml
学说配置:
dbal:
host: "%env(DATABASE_HOST)%"
port: "%env(DATABASE_PORT)%"
dbname: "%env(DATABASE_DB)%"
user: "%env(DATABASE_USER)%"
password: "%env(DATABASE_PASSWORD)%"
charset: UTF8
mapping_types:
enum: string
server_version: 5.6
编辑 4:
将以下内容添加到数据库配置中:
expose:
- 3306
这个答案适用于 docker-compose 版本 2,它也适用于版本 3:
问题是链接容器问题。 我们需要定义额外的别名,服务可以使用这些别名来相互访问。
暴露3306端口并不能解决你的问题。 mysql 或 percona容器将默认公开该端口。 查看percona 图像的docker hub 。 . 那里提到:
从另一个 Docker 容器中的应用程序连接到 MySQL
此映像公开了标准 MySQL 端口 (3306),因此容器链接使 MySQL 实例可用于其他应用程序容器。 像这样启动您的应用程序容器,以便将其链接到 MySQL 容器:
$ docker run --name some-app --link some-percona:mysql -d application-that-uses-mysql
因此,您应该将数据库链接到您的cg-demo容器。 有两种解决方案:
1)在配置下添加一个链接:
services:
cg-demo:
build: docker/cg-demo
container_name: cg-demo
.
.
.
links:
- mysql
depeds_on和links的depends_on
在于, depends_on
docker-compose up
会按照依赖顺序启动服务。 在以下示例中, database
将在 web 之前启动。
我们还可以访问数据。 但这还不够,因为我们要确保您的 Web 容器(cg-demo)始终连接到数据库容器。
链接允许您定义额外的别名,通过这些别名可以从另一个服务访问服务。 在以下示例中,可以从主机名数据库中的 web ( cg-demo
) 访问数据库。 这意味着cg-demo
可以从 3306 端口连接数据库容器。
2)第二种解决方案,是配置默认网络而不是(或除此之外)自定义您自己的网络。 只需在网络下定义一个默认条目:
networks:
bridge_name:
driver: bridge
然后你应该通过networks
标签将每个容器链接到该桥:
cg-demo:
.
.
networks:
- bridge_name
database:
.
.
networks:
- bridge_name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.