2017-07-02 190 views
7

我有两个容器的docker-compose设置:一个是php/apache服务,另一个容器是数据库(mysql)。无法通过PHP连接到docker mysql

这里是我的搬运工,compose.yml

version: '2' 
services: 
    app: 
    depends_on: 
     - db 
    links: 
     - db:mysql 
    build: . 
    image: app 
    ports: 
     - "80:80" 
    restart: always 
    links: 
     - db:db 
    volumes: 
     - ../:/var/www/html/ 

    db: 
    image: mysql:latest 
    restart: unless-stopped 
    volumes: 
     - ./db_data:/var/lib/mysql 
     - ./databaseDumps:/tmp/databaseDumps 
    environment: 
     MYSQL_USER: "myApp" 
     MYSQL_PASSWORD: "root" 
     MYSQL_ROOT_PASSWORD: "root" 
     MYSQL_DATABASE: "myAppDatabase" 
     MYSQL_ROOT_HOST: "%" 

这里是我的应用程序Dockerfile:

FROM php:7-apache 

COPY prefilled_files/000-default.conf /etc/apache2/sites-available/000-default.conf 
RUN apt-get -qq update 
RUN apt-get -qq -y install libpng-dev curl git nano vim zip unzip mysql-client libmysqlclient-dev 
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - 
RUN apt-get install -y nodejs 
RUN npm install -g bower 
RUN npm install -g gulp 
RUN docker-php-ext-install pdo pdo_mysql gd mysqli 
EXPOSE 8080 80 

的主要问题是,MySQL数据库和应用程序容器运作良好,我可以通过应用程序容器连接到mysql数据库通过

[email protected]: mysql -h db -u myApp -p 

,但是

如果我尝试对我的symfony项目执行composer install,出现以下错误消息:

[Doctrine\DBAL\Driver\PDOException]   
    SQLSTATE[HY000] [2002] Connection refused 



    [PDOException]        
    SQLSTATE[HY000] [2002] Connection refused 

这里是我的我的应用程序的参数:

parameters: 
    database_driver: pdo_mysql 
    database_host: db 
    database_port: 3306 
    database_name: myAppDatabase 
    database_user: myApp 
    database_password: root 

为什么这发生? 我已阅读了几个论坛和网站,但没有任何帮助。 我尝试了以下解决方案,并没有任何帮助:

  • 结算symfony的缓存;)
  • mysql的容器暴露3306
  • 联动app和mysql的容器一起
  • 删除从我的电脑的所有图像和容器和重新安装了所有东西
  • 我在Windows和Ubuntu 17.04上试过。同样的行为

connecting to a docker-compose mysql container denies access but docker running same image does not

docker-compose wordpress mysql connection refused

UPDATE:

我试图从https://gist.github.com/chales/11359952一个小PHP脚本来访问我的数据库。 PHP /我的脚本实际上可以连接到数据库,所以问题必须与我的composer install或在教条或symfony的配置中。

TL;博士

  • 2泊坞容器经由坞窗构成
  • 我可以通过mysql命令访问该应用程序容器上的数据库但不超过composer install。为什么?
+0

而不是'database_host:db'尝试'database_host:foo'。错误应该是未知的主机。但是,如果错误继续相同,问题是您的配置文件是另一个。 – Robert

+0

@Robert我在尝试“database_host:foo”时得到了这个:'[Doctrine \ DBAL \ Exception \ ConnectionException] 驱动程序发生异常:SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo失败:名称或服务未知' – Rubinum

+0

当MySQL尚未启动时,作曲家有没有这么快的速度运行? – Robert

回答

3

我认为这是它试图通过主机名'db'找到容器的方式,我发现在运行docker的机器上,它似乎没有拾取guest容器的名称(可能是你可以改变的一些DNS配置),但是我一直在研究它的方式是找到MySQL容器的IP地址。我已经docker_db_1作为MySQL的容器名称,所以我来说(假设* nix中)

docker inspect docker_db_1 | grep IPAddress 

这在我的情况给我

"SecondaryIPAddresses": null, 
    "IPAddress": "", 
      "IPAddress": "172.18.0.2", 

而且我用这个IP地址(172.18.0.2)连接到而不是db。

+0

如果您的应用程序在config.yml中定义了多个数据库连接,那么请注意。 Symfony也将关注这些关系并进行测试。 – Rubinum