█
LastWrite
  • > Curriculum
  • > Pricing
  • > For Educators
  • > About
  • > Contact
Log InGet Started

Questions, concerns, bug reports, or suggestions? We read every message, write to us at [email protected].

More ways to reach us →
LastWrite

Structured computer science lessons for aspiring developers and security professionals.

[email protected]

(201) 785-7951

Mon–Fri, 9 AM–5 PM EST

Learn

  • Curriculum
  • Pricing

Company

  • About
  • For Educators & Schools
  • Contact Us

Legal

  • Terms of Service
  • Privacy Policy
© 2026 LastWrite. All rights reserved.
Curriculum/DevOps and Infrastructure/Docker and Containerization/Passion Project: Deploy a Containerized App
180 minAdvanced

Passion Project: Deploy a Containerized App

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.

Prerequisites:Running Real Applications in Docker

Milestone 1 — Containerize

Adapt the templates from earlier lessons.

  1. 1

    Pick the project: yours or the do-docker-09 template

  2. 2

    Dockerfile for each app component (web, api, worker), multi-stage, non-root, healthchecks where possible

  3. 3

    docker-compose.yml with web + api + db + cache + reverse proxy (Caddy or nginx)

  4. 4

    .env.example committed; real .env never committed

  5. 5

    .dockerignore at the root and in each app dir

  6. 6

    Verify locally: docker compose up brings up everything healthy

Milestone 2 — Deploy to a VPS

$5/mo droplet from any provider. The Linux passion project's box works perfectly.

  1. 1

    SSH into the VPS (use the hardened setup from do-linux-passion)

  2. 2

    Install Docker via the official script: curl -fsSL https://get.docker.com | sudo bash

  3. 3

    Add your user to the docker group: sudo usermod -aG docker $USER ; relog

  4. 4

    Clone your repo to /srv/myapp

  5. 5

    Copy production .env via scp (not git): scp .env.prod deploy@vps:/srv/myapp/.env

  6. 6

    docker compose pull (or build); docker compose up -d

  7. 7

    Verify: docker compose ps shows all services healthy

Milestone 3 — Custom domain + HTTPS

Free domain via Freenom or a real one from Cloudflare ($10/yr). Caddy handles HTTPS automatically.

  1. 1

    Point your domain's A record to the VPS IP (DNS propagates in minutes)

  2. 2

    Edit Caddyfile: replace example.com with your real domain

  3. 3

    docker compose restart caddy

  4. 4

    First HTTP request to the domain triggers Let's Encrypt cert issuance (Caddy does it automatically)

  5. 5

    Verify: https://yourdomain.com loads with a green padlock

  6. 6

    Force HTTPS: Caddy redirects HTTP to HTTPS by default

Milestone 4 — Documentation

The README is the deliverable.

  1. 1

    Top: project name + screenshot + live URL

  2. 2

    'How to run locally': git clone + docker compose up

  3. 3

    'Architecture' section with a diagram (Excalidraw → PNG works; or Mermaid in markdown)

  4. 4

    Describe each service: what it does, what it depends on

  5. 5

    'Deploy' section: how the project goes from git push to live URL

  6. 6

    'Environment variables' section: every var with description (don't leak the values)

  7. 7

    License + Contributing

💡 How to talk about this in an interview

Live URL on screen-share is the centerpiece. Walk through docker-compose.yml: 'here's how the services talk; here's the healthcheck on Postgres; here's why depends_on uses service_healthy.' Show the multi-stage Dockerfile and the final image size. Show Caddyfile and explain auto-HTTPS. Ten minutes of demo proves you can run containers in production.

Common mistakes only candidates with offers avoid

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.

Sign in to purchase
←Container Security
Back to Docker and Containerization
Docker Job Readiness→