2017-07-02 188 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