Skip to main content

WordPress Multi-Container Setup

A Docker Compose project that runs WordPress and a MySQL database as two isolated containers in the same network. The project served as a hands-on exercise in container orchestration and the interaction of multiple services via Docker Compose.

Tech Stack

Docker Docker Compose WordPress MySQL 8.0 Apache

Project Structure

Wordpress-Multi-Container-Setup/
├── ⚙️ docker-compose.yml # Orchestration of both services
├── ⚙️ .env # Environment variables (not in repo)
├── ⚙️ .env.template # Template for .env
└── 📄 .gitignore

Quickstart

# Clone repository
git clone git@github.com:EnsslinAdrian/Wordpress-Multi-Container-Setup.git
cd Wordpress-Multi-Container-Setup

# Create and fill .env file
cp .env.template .env

# Start containers
docker compose up -d

WordPress available at: <YOUR_IP>:8000

Architecture

Both services run in the same Docker network wp-net and can reach each other via their service names.

WordPress Service

wordpress:
image: wordpress:6-php8.4-apache
restart: on-failure:5
depends_on:
- db
ports:
- "8000:80"
networks:
- wp-net
environment:
WORDPRESS_DB_HOST: ${WORDPRESS_DB_HOST}
WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_PASSWORD}
WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
volumes:
- wordpress_data:/var/www/html
ConfigurationDescription
depends_onDatabase starts before WordPress
restartAutomatic restart on failure, max. 5×
portsHost port 8000 → container port 80
volumesWordPress data persisted at /var/www/html

MySQL Service

db:
image: mysql:8.0
restart: on-failure:5
networks:
- wp-net
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_RANDOM_ROOT_PASSWORD: ${MYSQL_RANDOM_ROOT_PASSWORD}
volumes:
- db_data:/var/lib/mysql
ConfigurationDescription
restartAutomatic restart on failure, max. 5×
volumesDatabase data persisted at /var/lib/mysql
MYSQL_RANDOM_ROOT_PASSWORDRoot password is randomly generated

Useful Docker Commands

docker compose up -d          # Start
docker compose down # Stop
docker compose down -v # Stop + delete volumes
docker compose restart # Restart

docker ps # Show running containers
docker logs -f <container> # Follow logs live

What I Learned

  • Multi-Container Orchestration — Starting, stopping and managing multiple services together
  • Docker Networking — Connecting services via a shared network
  • Volumes — Ensuring data persistence outside of containers
  • Environment Variables — Safely externalizing sensitive credentials via .env
  • depends_on — Controlling the startup order of services