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
Top comments (0)