PHP and MySQL Server with docker-compose

Last Update: 2023-04-16

This post shows how to create a docker-compose.yml file, which hosts an apache server (with PHP) and MySQL database and connect them correctly together.

The directory of your project should look like this:

project-directory
|
+--docker-compose.yml
+-+php
  |
  +-Dockerfile
  +-index.php

The docker-compose.yml:

version: '3.8'
services:
    php-apache-environment:
      container_name: php-apache
      build:
        context: ./php
        dockerfile: Dockerfile
      depends_on:
          - db
      volumes:
          - ./php:/var/www/html/
          - mysql-sock-volume:/var/run/mysqld
      ports:
          - 8000:80
    db:
        container_name: db
        image: mysql
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: exampledb
            MYSQL_USER: exampleuser
            MYSQL_PASSWORD: exampleuser
        volumes:
            - mysql-sock-volume:/var/run/mysqld
volumes:
    mysql-sock-volume:

The Dockerfile in the php directory:

FROM php:8.1-apache

RUN docker-php-ext-install mysqli pdo pdo_mysql

Connect to the database in the index.php:

<?php
$pdo = new \PDO(
  'mysql:dbname=exampledb;unix_socket=/var/run/mysqld/mysqld.sock',
  'exampleuser',
  'examplepassword'
);
var_dump($pdo->query('SELECT now()')->fetchAll());

The webserver will be served on http://localhost:8000.