Symfony + Docker,连接被拒绝

我在Symfony中经验丰富,但是对于docker工人来说是一个新的东西,我有一个“连接拒绝错误”,我不能解决。

很确定这是一个初学者的错误,这里的解决scheme是相当简单的…

以下是我的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文件中的连接信息如下.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教义configuration:

 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:

将以下内容添加到数据库configuration中:

 expose: - 3306 

您需要在Docker内部networking上公开端口(通过expose: :),不仅可以通过ports: (通过ports: :)将另一个容器连接到主机。

ping是正常的,但是如果你没有明确暴露它的话,端口(例如3306)会被docker的防火墙阻塞。

将以下内容添加到您的撰写文件中:

 services: mysql: # [..] expose: - 3306 

进一步确保MySQL正在监听所有的networking设备。 默认情况下(至less在Ubuntu上)只能在本地主机上监听,也就是说。 回送接口(127.0.0.1)。 你需要MySQLconfiguration中的以下行。

 bind-address=0.0.0.0