gpt4 book ai didi

php - Symfony + Docker,连接被拒绝

转载 作者:行者123 更新时间:2023-11-29 02:43:18 24 4
gpt4 key购买 nike

我在 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 数据库 并且它有效...

编辑 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 image. 的 docker hub .那里提到:

Connect to MySQL from an application in another Docker container

This image exposes the standard MySQL port (3306), so container linking makes the MySQL instance available to other application containers. Start your application container like this in order to link it to the MySQL container:

$ 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_onlinks 的区别在于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

关于php - Symfony + Docker,连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46828178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com