Section 02
Docker Notes
From hello-world to PHP + MySQL + phpMyAdmin.
Image
Template / lunchbox. Built from Dockerfile. Does not run by itself.
Container
Running instance. Created by docker run / compose up.
Dockerfile → docker build → IMAGE → docker run → CONTAINER
Ports: -p HOST:CONTAINER example 8080:80
Verify Docker
docker --version docker compose version docker run hello-world
First real app — nginx
docker run -d -p 8080:80 --name web nginx # open http://localhost:8080 docker ps docker logs web docker stop web docker rm -f web
Dockerfile + build/run PHP
FROM php:8.4-apache WORKDIR /var/www/html RUN docker-php-ext-install pdo pdo_mysql COPY src/ . EXPOSE 80
docker build -t my-php-app . docker run -d -p 8080:80 --name php-app my-php-app # http://localhost:8080
Docker Compose — PHP + MySQL + phpMyAdmin
services:
php:
build: .
ports: ["8080:80"]
depends_on: [mysql]
mysql:
image: mysql:8.0
environment:
MYSQL_DATABASE: workshop
MYSQL_USER: workshop
MYSQL_PASSWORD: workshop
MYSQL_ROOT_PASSWORD: root
volumes: [mysql_data:/var/lib/mysql]
phpmyadmin:
image: phpmyadmin:latest
ports: ["8081:80"]
environment:
PMA_HOST: mysql
volumes:
mysql_data:
docker compose up -d --build docker compose ps docker compose logs -f php # App: http://localhost:8080 # phpMyAdmin: http://localhost:8081 (server: mysql) docker compose down
Debug checklist
- Is Docker Desktop / Engine running?
- docker compose ps — containers up?
- docker compose logs — what failed?
- Port busy? change host port or stop old container
- PHP → MySQL host must be mysql