DEV Community

Cover image for Run PHP and MySQL in Docker
Rafli Zocky
Rafli Zocky

Posted on Originally published at Medium

Run PHP and MySQL in Docker

It works on my machine.

Steps

1. Create a new directory

.
├── docker-compose.yml
├── Dockerfile
├── .env.example
├── README.md
└── src/
    └── index.php
Enter fullscreen mode Exit fullscreen mode

2. Create docker-compose.yml

version: '3.8'
services:
  app:
    build: .
    container_name: php_app
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
    depends_on:
      db:
        condition: service_healthy
    env_file:
      - .env
    networks:
      - app_network

  db:
    image: mysql:8.0
    container_name: php_db
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    env_file:
      - .env
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_ROOT_PASSWORD}"]
      interval: 5s
      timeout: 10s
      retries: 10
    networks:
      - app_network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      db:
        condition: service_healthy
    ports:
      - 8081:80
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      PMA_ARBITRARY: ${PMA_ARBITRARY}
    env_file:
      - .env
    networks:
      - app_network

volumes:
  mysql_data:

networks:
  app_network:
    driver: bridge
Enter fullscreen mode Exit fullscreen mode

3. Create Dockerfile

FROM php:8.2-apache
RUN docker-php-ext-install pdo pdo_mysql mysqli
RUN a2enmod rewrite
Enter fullscreen mode Exit fullscreen mode

4. Create src/index.php

<?php
$wait = 30;
$db_host = 'db';
$db_name = getenv('DB_DATABASE');
$db_user = getenv('DB_USERNAME');
$db_pass = getenv('DB_PASSWORD');

$start = time();
$connected = false;

while (time() - $start < $wait && !$connected) {
    try {
        $pdo = new PDO(
            "mysql:host=$db_host;dbname=$db_name",
            $db_user,
            $db_pass,
            [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
        );
        $connected = true;
        echo "<h2>Database connection successful!</h2>";
        $stmt = $pdo->query("SELECT VERSION()");
        echo "<p>MySQL version: " . $stmt->fetchColumn() . "</p>";
    } catch (PDOException $e) {
        if (time() - $start >= $wait) {
            echo "<h2>Connection failed after $wait seconds</h2>";
            echo "<p>" . $e->getMessage() . "</p>";
        }
        sleep(2);
    }
}
Enter fullscreen mode Exit fullscreen mode

5. Create .env

DB_ROOT_PASSWORD=rootpassword
DB_DATABASE=myapp
DB_USERNAME=myuser
DB_PASSWORD=mypassword

PMA_ARBITRARY=1
Enter fullscreen mode Exit fullscreen mode

How to start

# Start everything
docker-compose up -d

# Check if running
docker-compose ps

# Stop everything
docker-compose down
Enter fullscreen mode Exit fullscreen mode

How to access

Full code: raflizocky/php-docker

References


Need help building your app?
I'm available for freelance web & Android development — raflizocky.netlify.app

☕ Support my writing: paypal.me/raflizocky · saweria.co/raflizocky

Top comments (0)