2017-10-19 144 views
0

我在Symfony中经验丰富,但对Docker来说很新,而且我有一个“连接拒绝错误”,我无法解决。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和它的作品...

EDIT 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 
+0

你必须公开端口为mysql,就像你使用'cg-demo'服务 –

+0

感谢您的反馈。这个帖子被更新了(仍然不起作用) – Zephyr

+0

还有一件事,我有类似的问题,我从服务中删除了“网络”属性,它起作用 –

回答

0

您需要公开码头的内部网络上的端口(通过expose:)( s)不仅可以将它们发送给主机(通过ports:),以便其他容器能够连接到它们。

ping可以正常工作,但是如果你没有明确地暴露它,端口(即你的情况下的3306)会被docker的防火墙阻塞。

以下添加到您撰写文件:

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

进一步确保MySQL正在对所有网络听设备。默认情况下(至少在Ubuntu上)只能在本地主机上监听,也就是说。回环接口(127.0.0.1)。您需要MySQL配置中的以下行。

bind-address=0.0.0.0 
+0

谢谢你的帮助!但仍然没有工作。我将bind-address'子句添加到mysql conf和'expose'中无济于事。 – Zephyr