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

  1. Is Docker Desktop / Engine running?
  2. docker compose ps — containers up?
  3. docker compose logs — what failed?
  4. Port busy? change host port or stop old container
  5. PHP → MySQL host must be mysql
Download Docker slides →