title: Using Docker I get the error: "SQLSTATE[HY000] [2002] No such file or directory"
body: <p>I'm using Docker to create a container to test my web app built on PHP and MySQL on my Mac.  My PHP app is built using Fat-Free Framework for MVC and routing.  I have two Dockerfiles, one for MySQL and one for PHP.  I've used test Docker applications successfully, so I believe my images are installed correctly.</p>
  
  <p>The main part of the error:</p>
  
  <pre><code>Internal Server Error
  
  SQLSTATE[HY000] [2002] No such file or directory
  
  [fatfree/lib/DB/SQL.php:466] PDO-&gt;__construct('mysql:host=127.0.0.1;port=3306;dbname=robohome','root','password',array(1002=&gt;'SET NAMES utf8;'))
  [fatfree/app/Controllers/Controller.php:24] DB\SQL-&gt;__construct('mysql:host=127.0.0.1;port=3306;dbname=robohome','root','password')
  </code></pre>
  
  <p>Note, if I connect using <code>127.0.0.1</code> instead of <code>localhost</code> I get a slightly different error that says: <code>SQLSTATE[HY000] [2002] Connection refused</code></p>
  
  <p>My PHP Dockerfile:</p>
  
  <pre><code>FROM php:5.6-apache
  
  RUN docker-php-ext-install mysqli pdo pdo_mysql
  RUN a2enmod rewrite
  </code></pre>
  
  <p>My MySQL Dockerfile:</p>
  
  <pre><code>FROM mysql:5.7
  
  ENV MYSQL_ROOT_PASSWORD password
  ENV MYSQL_DATABASE robohome
  
  COPY ./schema.sql /docker-entrypoint-initdb.d/
  </code></pre>
  
  <p>My <code>Controller.php</code> file where the error mentions line 24:</p>
  
  <pre><code>&lt;?php
  
  namespace Controllers;
  
  class Controller
  {
      protected $f3;
      protected $db;
  
      public function __construct()
      {
          $f3 = \Base::instance();
          $this-&gt;f3 = $f3;
  
          $mysqlServerName = $f3-&gt;get("MYSQL_SERVERNAME");
          $mysqlDatabseName = $f3-&gt;get("MYSQL_DBNAME");
  
          //$container = \DI\ContainerBuilder::buildDevContainer(); &lt;-Not used currently
  
          //Below is line 24 referred to in the error
          $db = new \DB\SQL(
              "mysql:host={$mysqlServerName};port=3306;dbname={$mysqlDatabseName}",
              $f3-&gt;get("MYSQL_USERNAME"),
              $f3-&gt;get("MYSQL_PASSWORD")
          );
  
          $this-&gt;db = $db;
      }
  </code></pre>
  
  <p>Those <code>MYSQL_*</code> values are pulled from an <code>.ini</code> file:</p>
  
  <pre><code>MYSQL_SERVERNAME = "localhost" &lt;-This is what I've tried changing to 127.0.0.1
  MYSQL_USERNAME = "root"
  MYSQL_PASSWORD = "password"
  MYSQL_DBNAME = "robohome"
  </code></pre>
  
  <p>My Docker compose file:</p>
  
  <pre><code>version: '2'
  
  services:
    web:
      build: ./docker/php
      ports:
        - 80:80
      volumes:
        - .:/var/www/html/
      links:
        - db
    db:
      build: ./docker/mysql
      ports:
        - 3306
  </code></pre>
  
  <p>I run this by doing <code>docker-compose up --build -d</code>.  The output I can then get from <code>docker ps</code> is:</p>
  
  <pre><code>CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
  f35066a16586        robohomeweb_mysql   "docker-entrypoint.sh"   3 minutes ago       Up 2 seconds        0.0.0.0:32777-&gt;3306/tcp   robohomeweb_mysql_1
  86d34eb34583        robohomeweb_php     "apache2-foreground"     3 minutes ago       Up 2 seconds        0.0.0.0:80-&gt;80/tcp        robohomeweb_php_1
  </code></pre>
  
  <p>If I run in the foreground instead, I get the following output:</p>
  
  <pre><code>Building php
  Step 1 : FROM php:5.6-apache
   ---&gt; 8f9b7e57129a
  Step 2 : RUN docker-php-ext-install mysqli pdo pdo_mysql
   ---&gt; Using cache
   ---&gt; fadd8f9e7207
  Step 3 : RUN a2enmod rewrite
   ---&gt; Using cache
   ---&gt; 9dfed7fdc60f
  Successfully built 9dfed7fdc60f
  Building mysql
  Step 1 : FROM mysql:5.7
   ---&gt; eda6a4884645
  Step 2 : ENV MYSQL_ROOT_PASSWORD password
   ---&gt; Using cache
   ---&gt; 759895ac5772
  Step 3 : ENV MYSQL_DATABASE robohome
   ---&gt; Using cache
   ---&gt; e926c5ecc088
  Step 4 : COPY ./schema.sql /docker-entrypoint-initdb.d/
   ---&gt; Using cache
   ---&gt; cf5d00aa8020
  Successfully built cf5d00aa8020
  Starting robohomeweb_php_1
  Starting robohomeweb_mysql_1
  Attaching to robohomeweb_mysql_1, robohomeweb_php_1
  php_1    | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
  php_1    | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
  php_1    | [Sun Oct 16 20:21:17.944575 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.26 configured -- resuming normal operations
  php_1    | [Sun Oct 16 20:21:17.946919 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
  mysql_1  | 2016-10-16T20:21:18.036272Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
  mysql_1  | 2016-10-16T20:21:18.038330Z 0 [Note] mysqld (mysqld 5.7.16) starting as process 1 ...
  mysql_1  | 2016-10-16T20:21:18.043331Z 0 [Note] InnoDB: PUNCH HOLE support available
  mysql_1  | 2016-10-16T20:21:18.043603Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
  mysql_1  | 2016-10-16T20:21:18.043951Z 0 [Note] InnoDB: Uses event mutexes
  mysql_1  | 2016-10-16T20:21:18.044077Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
  mysql_1  | 2016-10-16T20:21:18.044260Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
  mysql_1  | 2016-10-16T20:21:18.044414Z 0 [Note] InnoDB: Using Linux native AIO
  mysql_1  | 2016-10-16T20:21:18.045150Z 0 [Note] InnoDB: Number of pools: 1
  mysql_1  | 2016-10-16T20:21:18.045620Z 0 [Note] InnoDB: Using CPU crc32 instructions
  mysql_1  | 2016-10-16T20:21:18.047629Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
  mysql_1  | 2016-10-16T20:21:18.057705Z 0 [Note] InnoDB: Completed initialization of buffer pool
  mysql_1  | 2016-10-16T20:21:18.059988Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
  mysql_1  | 2016-10-16T20:21:18.074670Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
  mysql_1  | 2016-10-16T20:21:18.101209Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
  mysql_1  | 2016-10-16T20:21:18.101433Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
  mysql_1  | 2016-10-16T20:21:18.354806Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
  mysql_1  | 2016-10-16T20:21:18.356928Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
  mysql_1  | 2016-10-16T20:21:18.357158Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
  mysql_1  | 2016-10-16T20:21:18.358049Z 0 [Note] InnoDB: Waiting for purge to start
  mysql_1  | 2016-10-16T20:21:18.412987Z 0 [Note] InnoDB: 5.7.16 started; log sequence number 12179647
  mysql_1  | 2016-10-16T20:21:18.414470Z 0 [Note] Plugin 'FEDERATED' is disabled.
  mysql_1  | 2016-10-16T20:21:18.421833Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
  mysql_1  | 2016-10-16T20:21:18.424144Z 0 [Note] InnoDB: Buffer pool(s) load completed at 161016 20:21:18
  mysql_1  | 2016-10-16T20:21:18.425607Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
  mysql_1  | 2016-10-16T20:21:18.427018Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
  mysql_1  | 2016-10-16T20:21:18.427581Z 0 [Note] IPv6 is available.
  mysql_1  | 2016-10-16T20:21:18.427749Z 0 [Note]   - '::' resolves to '::';
  mysql_1  | 2016-10-16T20:21:18.428019Z 0 [Note] Server socket created on IP: '::'.
  mysql_1  | 2016-10-16T20:21:18.456023Z 0 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
  mysql_1  | 2016-10-16T20:21:18.456354Z 0 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
  mysql_1  | 2016-10-16T20:21:18.480237Z 0 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
  mysql_1  | 2016-10-16T20:21:18.488758Z 0 [Note] Event Scheduler: Loaded 0 events
  mysql_1  | 2016-10-16T20:21:18.490880Z 0 [Note] mysqld: ready for connections.
  mysql_1  | Version: '5.7.16'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
  </code></pre>
  
  <p>From my research, I've tried connecting using both <code>localhost</code> and <code>127.0.0.1</code> since they're technically treated differently.  It could also be something related to trying to talk via sockets instead of TCP.  Ideally I would like a solution that I can bake into my Dockerfiles so I don't have to worry about remembering commands or how I did something.</p>