无法通过PHP连接到docker mysql

我有一个docker-compose设置了两个容器:一个是php / apache服务,另一个容器是数据库(mysql)。

这是我的docker-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数据库

 $root@app: 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 

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

  • 清除symfonycaching;)
  • 在mysql容器上暴露3306
  • 链接应用程序和MySQL容器在一起
  • 从我的电脑中删除所有的图像和容器,并重新安装一切
  • 我尝试在Windows和Ubuntu 17.04。 同样的行为

连接到docker-compose mysql容器会拒绝访问,但docker运行相同的映像不会

docker-compose wordpress mysql连接被拒绝

更新:

我尝试从https://gist.github.com/chales/11359952上使用一个小小的PHP脚本访问我的数据库。 PHP /我的脚本实际上可以连接到数据库 ,所以问题必须在我的composer install或在学说或在我的configurationsymfony。

TL;博士

  • 2docker集装箱通过docker组成
  • 我可以通过应用程序容器上的mysql命令访问数据库,但不能通过composer install 。 为什么?

我认为这是它试图通过主机名'db'find容器的方式,我发现在运行docker的机器上,它似乎没有拿起guest容器的名字(可能是一些DNSconfiguration你可以改变),但我已经工作的方式是findMySQL容器的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 )来连接而不是数据库。