Docker & Docker Compose Multi-Container Setup
Docker ဖြင့် Container အခြေခံ ဆာဗာ တည်ဆောက်ခြင်း
Containerize full-stack apps. Run Web App + PostgreSQL + Redis on a single VPS with Docker Compose, persistent volumes, and isolated networks.
Dockerfile ရေးသားနည်း၊ docker-compose.yml ဖြင့် App, PostgreSQL, Redis များကို container ခွဲခြား run ပြီး Data Volume သိမ်းဆည်းနည်း။
1. Why Containerize on VPS? (VPS ပေါ်တွင် Docker ဘာကြောင့် သုံးသလဲ)
"Works on my machine" ပြဿနာကို အပြီးတိုင် ဖြေရှင်းခြင်း
ဆာဗာပေါ်တွင် Node version မတူညီခြင်း၊ Python dependency conflict ဖြစ်ခြင်း၊ OS library ကွဲပြားခြင်း စသည့် ပြဿနာများကို Docker Container က လုံးဝ အဆုံးသတ်ပေးပါသည်။
Database, Cache, Backend, Frontend များကို သီးသန့် Container အသီးသီး ခွဲခြားထားနိုင်ပြီး ဆာဗာ ပြောင်းရွှေ့ရာတွင်လည်း `docker compose up -d` တစ်ချက် run ရုံဖြင့် စက္ကန့်ပိုင်းအတွင်း အဆင်သင့် ဖြစ်စေပါသည်။
2. Production Docker Compose Stack (App + Postgres + Redis)
လက်တွေ့သုံး docker-compose.yml ဖိုင် ဖွဲ့စည်းပုံ
အောက်ပါ Compose ဖိုင်သည် Node Web App တစ်ခု၊ PostgreSQL Database တစ်ခုနှင့် Redis Caching Server တစ်ခုကို သီးသန့် internal network ဖြင့် ချိတ်ဆက်ထားပုံ ဖြစ်ပါသည်။
version: '3.8'
services:
web:
build: .
restart: always
ports:
- "127.0.0.1:3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://dbuser:securepass@db:5432/production_db
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
networks:
- internal-net
db:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_USER: dbuser
POSTGRES_PASSWORD: securepass
POSTGRES_DB: production_db
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- internal-net
cache:
image: redis:7-alpine
restart: always
networks:
- internal-net
volumes:
pgdata:
driver: local
networks:
internal-net:
driver: bridge
Command ရှင်းလင်းချက် (ဖတ်ရှုရန် နှိပ်ပါ)
Database နှင့် Redis သည် host network ပေါ်သို့ port ဖွင့်မထားဘဲ internal-net network ထဲတွင်သာ လုံခြုံစွာ စကားပြောကြပြီး၊ web container သာ 127.0.0.1:3000 သို့ ဖွင့်ပေးထားသဖြင့် အလွန်လုံခြုံမှု ရှိပါသည်။
Why should database containers in docker-compose.yml communicate via internal networks rather than exposing ports to the public host?
docker-compose.yml တွင် Database (PostgreSQL) သို့မဟုတ် Redis port များကို host network ပေါ်သို့ အပြင်သို့ တိုက်ရိုက် မဖွင့်ပြဘဲ internal network ထဲတွင်သာ ထားရှိခြင်း၏ အဓိက အကျိုးကျေးဇူးမှာ အဘယ်နည်း?