Deploy Basics
Pattern การ deploy แบบง่าย
หัวข้อที่มีชื่อว่า “Pattern การ deploy แบบง่าย”การ deploy ที่ตรงไปตรงมาที่สุด: SSH ไปยัง server, pull image ใหม่, แล้วเริ่ม container
# บนเซิร์ฟเวอร์ deploydocker pull acme/api-server:2.1.0docker stop api-server || truedocker rm api-server || truedocker run -d \ --name api-server \ --restart unless-stopped \ -p 3000:3000 \ -e DATABASE_URL="$DATABASE_URL" \ acme/api-server:2.1.0|| true ป้องกัน pipeline ล้มเหลวหาก container ยังไม่มีอยู่ใน deploy ครั้งแรก
Restart policies
หัวข้อที่มีชื่อว่า “Restart policies”flag --restart บอก Docker ว่าต้องทำอะไรหาก container หยุดทำงาน:
| Policy | พฤติกรรม |
|---|---|
no (ค่าเริ่มต้น) | ไม่ restart เลย |
on-failure | Restart เฉพาะเมื่อ exit code ไม่ใช่ศูนย์ |
always | Restart เสมอ รวมถึงหลัง docker restart daemon |
unless-stopped | เหมือน always แต่ไม่ restart หากคุณ docker stop ด้วยตัวเอง |
สำหรับ production service ใช้ unless-stopped เพราะรอดทั้งการ reboot host และการ restart daemon แต่ยังเคารพการสั่งหยุดด้วยตัวคุณเอง
Rolling updates ด้วย Docker Compose
หัวข้อที่มีชื่อว่า “Rolling updates ด้วย Docker Compose”หาก server รัน service ด้วย Compose v2 อยู่แล้ว การอัปเดตทำได้ด้วยสองคำสั่ง:
# Pull image ที่อัปเดตทั้งหมดที่กำหนดใน compose.ymldocker compose pull
# Recreate container ที่มี image ใหม่กว่าdocker compose up -dCompose จะ recreate เฉพาะ service ที่ image digest เปลี่ยนแปลง โดยปล่อย service ที่ไม่เปลี่ยนแปลงให้รันต่อ หากคุณใช้ compose.yml ที่ pin image tag:
services: api: image: acme/api-server:2.1.0 restart: unless-stopped ports: - "3000:3000" env_file: - .envเปลี่ยน tag ใน compose.yml แล้วรัน docker compose up -d — Compose จะตรวจพบการเปลี่ยน tag และ recreate service
Environment variables และ secrets บน host
หัวข้อที่มีชื่อว่า “Environment variables และ secrets บน host”ห้ามฝัง secrets ไว้ใน image ให้ส่งผ่านตอน runtime แทน
สามแนวทาง เรียงจากง่ายไปถึงปลอดภัยที่สุด:
1. Environment variables ผ่าน -e
หัวข้อที่มีชื่อว่า “1. Environment variables ผ่าน -e”docker run -d \ -e DATABASE_URL="postgres://user:pass@db:5432/app" \ -e SECRET_KEY="abc123" \ acme/api-server:2.1.0ง่าย แต่ค่าจะปรากฏใน docker inspect output และ shell history
2. Environment file ผ่าน --env-file
หัวข้อที่มีชื่อว่า “2. Environment file ผ่าน --env-file”# .env (ไม่ commit เข้า git)DATABASE_URL=postgres://user:pass@db:5432/appSECRET_KEY=abc123docker run -d --env-file .env acme/api-server:2.1.0สะอาดกว่า -e flags เก็บไฟล์ .env ใน secrets manager หรือ vault บน server
3. Docker secrets (Swarm / Compose)
หัวข้อที่มีชื่อว่า “3. Docker secrets (Swarm / Compose)”สำหรับทีมที่รัน Docker Swarm หรือ Compose กับ block secrets: นั้น secrets จะถูก mount เป็นไฟล์ที่ /run/secrets/<name> ภายใน container นี่คือตัวเลือกที่ปลอดภัยที่สุด — secrets ไม่ถูกเปิดเผยเป็น environment variables
services: api: image: acme/api-server:2.1.0 secrets: - db_password
secrets: db_password: external: trueตรวจสอบการ deploy
หัวข้อที่มีชื่อว่า “ตรวจสอบการ deploy”หลัง pull และ restart ยืนยันว่า version ใหม่กำลังรัน:
docker psdocker logs api-server --tail 20docker inspect api-server | grep Imageลองทำ: pull และรัน public image พร้อม restart policy
หัวข้อที่มีชื่อว่า “ลองทำ: pull และรัน public image พร้อม restart policy”Snippet ด้านล่างแสดงการ docker pull, docker run -d --restart unless-stopped, และการตรวจสอบ log — ใช้ public image ดังนั้นไม่ต้องใช้ credentials
# Pull a versioned nginx image
docker pull nginx:1.27-alpine
# Run it detached with a restart policy
docker run -d \
--name web \
--restart unless-stopped \
-p 8080:80 \
nginx:1.27-alpine
# Verify it is running
docker ps
# Check logs
docker logs web --tail 5
# Simulate an update: pull a different tag and recreate
docker pull nginx:1.26-alpine
docker stop web && docker rm web
docker run -d \
--name web \
--restart unless-stopped \
-p 8080:80 \
nginx:1.26-alpine
docker psข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
Deploy ด้วย docker run ตรง ๆ | เข้าใจง่าย ควบคุมทุกขั้นตอนได้ตรงไปตรงมา | ไม่มี rollback อัตโนมัติ ต้อง script การเช็คและย้อนกลับเอง |
Deploy ด้วย docker compose up -d | Declarative รองรับหลาย service พร้อมกัน recreate เฉพาะที่ image เปลี่ยน | ยังไม่ใช่ full orchestration ไม่มี health-based rollback แบบ Kubernetes |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- Deploy image เวอร์ชันใหม่ขึ้น production โดยไม่เคยรัน vulnerability scan ก่อนเลย
- Pull image แล้ว restart ทันทีโดยไม่ทดสอบว่า container รันขึ้นจริงก่อน promote ไปสภาพแวดล้อมถัดไป
- Push และ deploy เฉพาะ
latesttag ทำให้ไม่มี version ที่ pin ไว้ให้ rollback กลับไปได้เมื่อ deploy มีปัญหา
💡 ตัวอย่างจากของจริง
หลายทีมใช้ Trivy (open-source scanner จาก Aqua Security) เป็น gate ใน pipeline ก่อนขั้นตอน deploy — หากพบ critical CVE ใน image จะ block การ deploy โดยอัตโนมัติ แทนที่จะปล่อยให้ image ที่มีช่องโหว่หลุดไปถึง production