After this lesson, you will be able to: Containerize an existing project end-to-end with Docker Compose, deploy it to a VPS with a custom domain, and document the architecture.
Passion project for the Docker sub-track per Curriculum-Upgrade.md. Pick a project you already have (or use the multi-service template from do-docker-09), containerize it fully, and ship it to a real domain.
Adapt the templates from earlier lessons.
Pick the project: yours or the do-docker-09 template
Dockerfile for each app component (web, api, worker), multi-stage, non-root, healthchecks where possible
docker-compose.yml with web + api + db + cache + reverse proxy (Caddy or nginx)
.env.example committed; real .env never committed
.dockerignore at the root and in each app dir
Verify locally: docker compose up brings up everything healthy
$5/mo droplet from any provider. The Linux passion project's box works perfectly.
SSH into the VPS (use the hardened setup from do-linux-passion)
Install Docker via the official script: curl -fsSL https://get.docker.com | sudo bash
Add your user to the docker group: sudo usermod -aG docker $USER ; relog
Clone your repo to /srv/myapp
Copy production .env via scp (not git): scp .env.prod deploy@vps:/srv/myapp/.env
docker compose pull (or build); docker compose up -d
Verify: docker compose ps shows all services healthy
Free domain via Freenom or a real one from Cloudflare ($10/yr). Caddy handles HTTPS automatically.
Point your domain's A record to the VPS IP (DNS propagates in minutes)
Edit Caddyfile: replace example.com with your real domain
docker compose restart caddy
First HTTP request to the domain triggers Let's Encrypt cert issuance (Caddy does it automatically)
Verify: https://yourdomain.com loads with a green padlock
Force HTTPS: Caddy redirects HTTP to HTTPS by default
The README is the deliverable.
Top: project name + screenshot + live URL
'How to run locally': git clone + docker compose up
'Architecture' section with a diagram (Excalidraw → PNG works; or Mermaid in markdown)
Describe each service: what it does, what it depends on
'Deploy' section: how the project goes from git push to live URL
'Environment variables' section: every var with description (don't leak the values)
License + Contributing
Containerizing but skipping the deploy. Live URL is the artifact. Hardcoding secrets in docker-compose.yml. Use env files; .env in .gitignore. Forgetting backups. A volume without a backup script is an incident waiting to happen. Skipping the architecture diagram. Hiring managers skim READMEs; a picture saves you. Not testing `docker compose down ; docker compose up` after a fresh boot. Restart parity is the muscle.
Sign in and purchase access to unlock this lesson.