Originally published byDev.to
It works on my machine.
Steps
1. Create a new directory
.
├── docker-compose.yml
├── Dockerfile
├── .env.example
├── README.md
└── src/
└── index.php
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
3. Create Dockerfile
FROM php:8.2-apache
RUN docker-php-ext-install pdo pdo_mysql mysqli
RUN a2enmod rewrite
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);
}
}
5. Create .env
DB_ROOT_PASSWORD=rootpassword
DB_DATABASE=myapp
DB_USERNAME=myuser
DB_PASSWORD=mypassword
PMA_ARBITRARY=1
How to start
# Start everything
docker-compose up -d
# Check if running
docker-compose ps
# Stop everything
docker-compose down
How to access
- PHP App: http://localhost:8080
-
phpMyAdmin: http://localhost:8081 (server:
db, username:root, password:rootpassword)
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
🇺🇸
More news from United StatesUnited States
NORTH AMERICA
Related News
How Braze’s CTO is rethinking engineering for the agentic area
10h ago
Amazon Employees Are 'Tokenmaxxing' Due To Pressure To Use AI Tools
21h ago

Implementing Multicloud Data Sharding with Hexagonal Storage Adapters
15h ago

DeepMind’s CEO Says AGI May Be ~4 Years Away. The Last Three Missing Pieces Are Not What Most People Think.
15h ago

CCSnapshot - A Claude Code Configs Transfer Tool
21h ago