กำลังโหลดเนื้อหา
สื่อนำเสนอ: Docker สำหรับ Mendix
Updates & Additions (1)
# สื่อนำเสนอ: Docker สำหรับ Mendix

## 1) สคริปต์คำพูดตอนสอน (พูดตามได้เลย ~3–4 นาทีต่อภาพ)
**เปิดหัวข้อ — ปัญหาที่ Docker มาแก้:**
"ปกติการเอา Mendix app ไปรันบนเครื่อง server ต้องลงทุกอย่างเองทีละอย่าง เวอร์ชันไม่ตรงกันก็พังได้ง่าย วันนี้เราจะใช้ Docker ห่อแอปพร้อมทุกอย่างที่มันต้องใช้ไว้ในกล่องเดียว ย้ายไปรันที่ไหนก็เหมือนกันหมด"
**ไล่ตามภาพ 5 ขั้น (ชี้ทีละบล็อกซ้ายไปขวา):**
1. "เริ่มจากไฟล์ `.mda` — นี่คือไฟล์ที่ export ออกมาจาก Mendix Studio Pro เป็นตัวแอปของเราทั้งก้อน"
2. "เอา `.mda` มาเข้ากระบวนการ `docker build` โดยใช้ตัวช่วยที่ Mendix เตรียมไว้ให้ชื่อ buildpack — มันจะจัดการ runtime, Java, ทุกอย่างให้อัตโนมัติ"
3. "ผลลัพธ์ที่ได้คือ Docker image ชื่อ `myapp:1.0` — เปรียบเหมือนแม่พิมพ์ที่พร้อมปั๊มออกมารันกี่ตัวก็ได้ เหมือนกันทุกตัว"
4. "พอสั่ง `docker compose up` มันจะยกขึ้นมา 2 container พร้อมกัน: ตัวแอป Mendix เปิดที่ port 8080 กับ PostgreSQL เป็นฐานข้อมูล — สองตัวนี้คุยกันผ่าน network ภายในด้วยค่า `DATABASE_ENDPOINT` ส่วน volume ข้างล่างคือที่เก็บข้อมูลถาวร ต่อให้ปิด container ข้อมูลก็ไม่หาย"
5. "สุดท้ายเราเปิดเบราว์เซอร์เข้า `http://host:8080` ก็เจอแอปรันจริง ล็อกอินด้วย admin password ที่เราตั้งไว้"
**ปิดท้าย — ประเด็นสำคัญที่อยากให้จำ:**
- "compose แยกแอปกับฐานข้อมูลเป็นคนละ container แต่ผูกกันด้วย network — เปลี่ยน/อัปเกรดทีละตัวได้"
- "`depends_on: service_healthy` ทำให้แอปรอจนฐานข้อมูลพร้อมก่อน ไม่ใช่แค่ 'เริ่มแล้ว' — กัน error ตอน start"
- "จุดที่พลาดกันบ่อยสุด: `docker compose down` เฉยๆ ข้อมูลอยู่ครบ แต่ถ้าเติม `-v` ข้อมูลหายหมดกู้ไม่ได้ — จำให้แม่น"
---
## 2) สรุปคำสั่งที่ต้องใช้ใน Lab (cheat sheet แจกผู้เรียนได้)
**ขั้น 1 — เช็คเครื่องพร้อม**
```bash
docker version # ต้อง >= 17.05
unzip -v && git --version
docker pull postgres:17-alpine
```
**ขั้น 2 — Clone buildpack + สร้าง rootfs (ครั้งเดียว/เครื่อง) + แตก .mda + Build image** *(buildpack v5)*
```bash
git clone --branch latest --config core.autocrlf=false \
https://github.com/mendix/docker-mend
cd docker-mendix-buildpack
# (ทำครั้งเดียวต่อเครื่อง) สร้าง rootfs 2 ตัว — CF_BUILDPACK ถูก pin ตรงนี้ที่เดียว
docker build -f rootfs-builder.dockerfile
--build-arg CF_BUILDPACK=v5.0.31 --tag mendix-rootfs:builder .
docker build -f rootfs-app.dockerfile --t
# แตก .mda (มันคือ zip) ให้ครบทุกโฟลเดอร์
mkdir -p project
unzip /path/to/YourApp.mda -d project
# build image ของแอป — ใส่แค่ BUILD_PATH (v
docker build --build-arg BUILD_PATH=project --tag myapp:1.0 .
docker images | grep myapp # ยืนยัน build สำเร็จ
```
> ⚠️ `--config core.autocrlf=false` สำคัญมาก (โดยเฉพาะเครื่อง Windows) ถ้า build fail แบบ "command not found" แปลกๆ
ให้เช็คบรรทัดนี้ก่อน
> ℹ️ **v5 ต่างจาก v4:** `CF_BUILDPACK` (ใช้ **v5.0.31** บนเครื่อง lab) ถูก pin ตอนสร้าง `mendix-rootfs:builder` → ตอน
build แอปใส่แค่ `BUILD_PATH` ตัวเดียว · บนเครื่ว เหลือแค่บรรทัด `docker build --build-argBUILD_PATH=project ...` บรรทัดเดียว
**ขั้น 3 — เขียน `compose.yaml` แล้วรันจริง**
```yaml
services:
myapp:
image: myapp:1.0
ports: ["8080:8080"]
environment:
ADMIN_PASSWORD: Str0ng!Passw0rd
DATABASE_ENDPOINT: postgres://mxuser:mxpass@db:5432/mendix
volumes:
- mendix_files:/opt/mendix/build/data/files
depends_on:
db:
condition: service_healthy
mem_limit: 1g
db:
image: postgres:17-alpine
environment:
POSTGRES_USER: mxuser
POSTGRES_PASSWORD: mxpass
POSTGRES_DB: mendix
volumes: ["pgdata:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U
interval: 10s
retries: 5
volumes:
mendix_files:
pgdata:
```
```bash
docker compose up -d
docker compose ps # myapp รอ db healthy ก่อน
docker compose logs -f myapp # ดู model
```
เปิดเบราว์เซอร์ → `http://<host>:8080` → ล็อก
**ขั้น 4 — พิสูจน์ว่าข้อมูลรอด**
```bash
docker compose down # ไม่ใส่ -v
docker compose up -d # เข้าเว็บอีกครั้ง ข้อมูลครบเหมือนเดิม
```
> ❗ `docker compose down -v` = ลบ volume ทิ้ง → ข้อมูล + ไฟล์อัปโหลดหายหมด กู้ไม่ได้ ใช้เฉพาะตอนตั้งใจล้างข้อมูลเท่านั้น
**สำหรับใช้พร้อมกันหลายคนบนเครื่องเดียว (กันชนกัน):** เปลี่ยน port/ชื่อ container/volume ให้มีชื่อ user นำหน้า เช่น `-p 8089:8080`, `--name $(whoami)-app`, `$(whoami)-db`, v08-lab-machine-setup-for-ai-agent.md` ข้อ7)