#7 of 11Docker & Docker Compose Multi-Container Setup
AdvancedContainers⏱️ 13 min

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 ဖြင့် ချိတ်ဆက်ထားပုံ ဖြစ်ပါသည်။

docker-compose.yml
yaml
1 $ version: '3.8'
2 $
3 $ services:
4 $ web:
5 $ build: .
6 $ restart: always
7 $ ports:
8 $ - "127.0.0.1:3000:3000"
9 $ environment:
10 $ - NODE_ENV=production
11 $ - DATABASE_URL=postgres://dbuser:securepass@db:5432/production_db
12 $ - REDIS_URL=redis://cache:6379
13 $ depends_on:
14 $ - db
15 $ - cache
16 $ networks:
17 $ - internal-net
18 $
19 $ db:
20 $ image: postgres:16-alpine
21 $ restart: always
22 $ environment:
23 $ POSTGRES_USER: dbuser
24 $ POSTGRES_PASSWORD: securepass
25 $ POSTGRES_DB: production_db
26 $ volumes:
27 $ - pgdata:/var/lib/postgresql/data
28 $ networks:
29 $ - internal-net
30 $
31 $ cache:
32 $ image: redis:7-alpine
33 $ restart: always
34 $ networks:
35 $ - internal-net
36 $
37 $ volumes:
38 $ pgdata:
39 $ driver: local
40 $
41 $ networks:
42 $ internal-net:
43 $ driver: bridge
💡Command ရှင်းလင်းချက် (ဖတ်ရှုရန် နှိပ်ပါ)

Database နှင့် Redis သည် host network ပေါ်သို့ port ဖွင့်မထားဘဲ internal-net network ထဲတွင်သာ လုံခြုံစွာ စကားပြောကြပြီး၊ web container သာ 127.0.0.1:3000 သို့ ဖွင့်ပေးထားသဖြင့် အလွန်လုံခြုံမှု ရှိပါသည်။

Knowledge Check

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 ထဲတွင်သာ ထားရှိခြင်း၏ အဓိက အကျိုးကျေးဇူးမှာ အဘယ်နည်း?