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