No stock images
Every Dockerfile from a base
Nginx · TLS
Single entry point
Volumes
State outlives containers
Overview
A complete web infrastructure in Docker Compose: Nginx terminating TLS, WordPress on PHP-FPM, and MariaDB behind it, each in its own container. The rule that makes it worth doing is that you may not pull a ready-made application image — every Dockerfile starts from a bare Debian or Alpine base and installs and configures the service by hand.
That constraint turns a copy-paste exercise into a real one. You end up understanding what an entrypoint script is actually for, why a container that forks into the background dies immediately, how volumes outlive the containers that write to them, and why service startup order is a promise Compose does not make for you. The bonus tier adds Redis, an FTP server, Adminer, Portainer and a static site, which is where the networking between containers stops being theoretical.
What it does
- 01Nginx terminating TLS on 443 in front of PHP-FPM, with WordPress and MariaDB publishing no ports at all
- 02WordPress and MariaDB each built from a base image, configured by their own entrypoint scripts
- 03WordPress held back until MariaDB reports healthy, through a Compose healthcheck rather than a sleep
- 04Named volumes so database and site content survive a full teardown
- 05A dedicated Docker network, with services addressing each other by name rather than by IP
- 06Environment-driven configuration, with no credentials baked into an image
- 07Bonus tier: Redis cache, FTP server, Adminer, Portainer and a static site
- 08A Makefile that brings the whole stack up, down and back from nothing