Symfony + Docker,连接被拒绝

时间:2017-10-19 10:48:38

标签: php mysql symfony docker

我在Symfony经验丰富,但对码头工作者来说很新,我有一个"连接拒绝错误"我无法解决问题。

很确定这是一个初学者错误,这里的解决方案非常简单......

以下是我的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

1 个答案:

答案 0 :(得分:1)

此答案适用于docker-compose版本2,也适用于版本3:

问题是链接容器问题。我们需要定义服务可以用来互相联系的其他别名。

暴露 3306端口不会解决您的问题。 mysql或percona 容器将通过默认配置暴露该端口。看一下percona image. 的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 链接之间的区别在于depends_on docker-compose up将以依赖关系顺序启动服务。在您的以下示例中,database将在网络之前启动。
我们还可以访问数据。但这还不够,因为我们要确保您的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