DevOps
น้องๆ หลายคนคงคุ้นเคยกับ Docker Compose ที่ใช้รันพวก development environment กันอยู่แล้ว แต่พอจะเอาขึ้น Production จริงๆ กลับงงว่า "เฮ้ย มันทำได้ด้วยเหรอ?" คำตอบคือ "ได้" แต่มันต้องมีเทคนิคกันหน่อย
Docker Compose Production ไม่ใช่แค่เอา docker-compose up -d ไปรันบน server แล้วจบนะเว้ย! มันคือการที่เราใช้ Docker Compose มาจัดการ application ของเราบน Production environment อย่างเป็นระบบ มีการจัดการเรื่อง network, volume, resource limits, และ security อย่างเหมาะสม
ทำไมมันถึงสำคัญน่ะเหรอ? สมัยผมทำร้านเน็ต SiamCafe นะเว้ย (ตั้งแต่ปี 97 โน่น!) การ deploy application นี่โคตรปวดหัวเลย ต้องมานั่ง setup environment เองทีละเครื่องๆ แต่ Docker Compose Production ช่วยให้เรา deploy application ได้ง่าย, เร็ว, และ repeatable มากๆ ไม่ว่าจะเป็น application เล็กๆ หรือใหญ่ๆ ก็ตาม
อันนี้พื้นฐานสุดๆ ใครยังไม่รู้จัก Docker นี่ต้องไปทำการบ้านด่วนๆ Docker มันคือ containerization technology ที่ช่วยให้เรา package application พร้อม dependencies ทั้งหมดลงใน container แล้วเอาไปรันที่ไหนก็ได้ โดยไม่ต้องกังวลว่า environment จะไม่เหมือนกัน
Docker Compose คือ tool ที่ช่วยให้เรา define และ manage multi-container Docker application ได้ง่ายขึ้น โดยเราจะ define service ต่างๆ ในไฟล์ docker-compose.yml แล้วใช้คำสั่ง docker-compose up เพื่อรันทุกอย่างพร้อมกัน
เรื่อง network นี่สำคัญมากนะเว้ย ใน Production เราต้อง define network ให้ดีว่า container ไหนคุยกับ container ไหนได้บ้าง ส่วน volume ก็สำคัญไม่แพ้กัน เพราะมันคือที่เก็บข้อมูลของ container เราต้องจัดการให้ดีว่าข้อมูลจะถูก persist ยังไง เวลา container ตายไป
เอาล่ะ มาถึงส่วนที่สำคัญที่สุด คือเราจะเริ่มใช้งาน Docker Compose Production ยังไง? ผมบอกเลยว่ามันไม่ได้ยากอย่างที่คิด แค่ต้องเข้าใจ concept และมีขั้นตอนที่ถูกต้อง
docker-compose.yml ที่เหมาะสมกับ Productiondocker-compose.yml สำหรับ Development กับ Production มันไม่เหมือนกันนะเว้ย! ใน Production เราต้องกำหนด resource limits, restart policy, healthcheck, และ environment variables ที่เหมาะสม
ตัวอย่าง docker-compose.yml:
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
restart: always
deploy:
resources:
limits:
cpus: "0.5"
memory: 512M
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
interval: 30s
timeout: 10s
retries: 3
จากตัวอย่างนี้ เรากำหนด resource limits ให้ container web ใช้ CPU ไม่เกิน 0.5 core และ memory ไม่เกิน 512MB นอกจากนี้เรายังกำหนด restart policy เป็น always เพื่อให้ container restart อัตโนมัติเมื่อมันตาย และมี healthcheck เพื่อตรวจสอบว่า application ยังทำงานได้ปกติ
อย่า hardcode ค่า config ใน docker-compose.yml เด็ดขาด! ให้ใช้ environment variables แทน เพื่อให้เราสามารถ config application ได้ง่ายขึ้นโดยไม่ต้องแก้ไขไฟล์ docker-compose.yml
ตัวอย่างการใช้ environment variables:
version: "3.9"
services:
db:
image: postgres:14
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
แล้วเราก็ export environment variables เหล่านี้ก่อนรัน docker-compose up:
export DB_USER=myuser
export DB_PASSWORD=mypassword
export DB_NAME=mydb
docker-compose up -d
Logging และ Monitoring เป็นสิ่งสำคัญมากใน Production เราต้องมีระบบที่สามารถเก็บ log ของ application และ monitor resource usage เพื่อให้เราสามารถ troubleshoot ปัญหาได้ทันท่วงที
เราสามารถใช้ tools อย่าง ELK stack (Elasticsearch, Logstash, Kibana) หรือ Prometheus + Grafana เพื่อจัดการ logging และ monitoring ได้
แน่นอนว่า Docker Compose ไม่ใช่ทางเลือกเดียวในการ deploy application ใน Production ยังมีทางเลือกอื่นๆ อีกมากมาย เช่น Kubernetes, Docker Swarm, และ PaaS (Platform-as-a-Service) แต่ละทางเลือกก็มีข้อดีข้อเสียแตกต่างกันไป
| ทางเลือก | ข้อดี | ข้อเสีย | เหมาะกับใคร |
|---|---|---|---|
| Docker Compose |
|
|
ทีมขนาดเล็ก หรือ application ที่ไม่ได้ต้องการ scaling สูงมาก |
| Kubernetes |
|
|
ทีมขนาดใหญ่ หรือ application ที่ต้องการ scaling สูงมาก |
| Docker Swarm |
|
|
ทีมขนาดกลาง หรือ application ที่ต้องการ scaling แต่ไม่อยาก setup Kubernetes |
| PaaS (เช่น Heroku, AWS Elastic Beanstalk) |
|
|
ทีมที่ต้องการความสะดวกสบาย และไม่อยากดูแล infrastructure เอง |
สรุปคือ เลือกทางเลือกที่เหมาะสมกับขนาดและความต้องการของ application ของเรา ถ้า application เล็กๆ Docker Compose ก็เพียงพอแล้ว แต่ถ้า application ใหญ่ๆ และต้องการ scaling สูงๆ Kubernetes อาจเป็นทางเลือกที่ดีกว่า
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลยที่ SiamCafe Blog ยินดีให้คำปรึกษาเสมอ
อย่าลืมว่า Docker Compose Production ไม่ใช่แค่การรัน docker-compose up -d นะเว้ย! มันคือการที่เราใช้ Docker Compose มาจัดการ application ของเราบน Production environment อย่างเป็นระบบ
สมัยผมทำ SiamCafe ผมก็เจอปัญหาเยอะแยะมากมายเกี่ยวกับการ deploy application แต่พอมาใช้ Docker Compose ชีวิตมันง่ายขึ้นเยอะเลย ลองเอาไปปรับใช้กันดูนะ
สุดท้ายนี้ ขอฝาก SiamCafe Blog ไว้ด้วยนะครับ มีบทความดีๆ เกี่ยวกับ IT อีกเยอะแยะเลย
ดูวิดีโอเพิ่มเติมเกี่ยวกับDocker Compose Production:
เอาล่ะน้องๆ มาถึงตรงนี้ Docker Compose Production ไม่ใช่เรื่องยาก แต่จะทำให้มัน "ดี" นี่สิ ต้องมีเคล็ดลับกันหน่อย สมัยผมทำร้านเน็ต SiamCafe เนี่ย เรื่อง "ดี" นี่สำคัญสุด เพราะลูกค้าต้องแฮปปี้ถึงจะกลับมาอีก
จำไว้เลยว่า Production environment ไม่ใช่ playground เราต้องคิดถึง scalability, maintainability และ security เป็นหลัก
เรื่อง Volumes นี่สำคัญมาก สมัยก่อนผมเคยพลาด เอาข้อมูลสำคัญไปเก็บไว้ใน container พอ container พัง ข้อมูลหายหมด! ร้องไห้เลย
External volumes คือพระเอกของเรา เก็บข้อมูลไว้ข้างนอก container เลย เวลา container พัง ก็แค่สร้างใหม่ แล้ว mount volume เดิมกลับมา ข้อมูลอยู่ครบ!
version: "3.9"
services:
db:
image: postgres:14
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
ใน docker-compose.yml แบบนี้ db_data จะอยู่รอดปลอดภัย แม้ db จะตายจากไป
อย่าเอา secrets ไปใส่ใน docker-compose.yml เด็ดขาด! อันตรายมาก เหมือนเอา password แปะไว้หน้าบ้าน
ใช้ environment variables แทน แล้ว load จากไฟล์ .env หรือใช้ Docker Secrets จะปลอดภัยกว่าเยอะ
version: "3.9"
services:
web:
image: nginx:latest
environment:
- DATABASE_URL=${DATABASE_URL}
แล้วสร้างไฟล์ .env (อย่า commit ขึ้น Git นะ!):
DATABASE_URL=postgresql://user:password@db:5432/mydb
หรือถ้าใช้ Docker Secrets (ซับซ้อนกว่า แต่ปลอดภัยกว่า):
docker secret create db_password my_secret_password
Health checks นี่เหมือนหมอประจำตัว container เลย คอยเช็คว่า container เรายังสบายดีอยู่รึเปล่า ถ้าไม่สบาย ก็สั่ง restart เองได้
กำหนด health check ใน docker-compose.yml:
version: "3.9"
services:
web:
image: nginx:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
แบบนี้ Docker จะ curl ไปที่ http://localhost ทุก 30 วินาที ถ้า curl fail เกิน 3 ครั้ง Docker จะ restart container ให้เอง
Logging คือบันทึกชีวิต container เรา เวลาเกิดปัญหา Logging นี่แหละที่จะช่วยเราสืบสวนหาสาเหตุได้
ตั้งค่า Logging driver ให้ดีๆ เลือกใช้พวก json-file, fluentd หรือ syslog แล้วส่ง log ไปรวมศูนย์ที่เดียว จะได้ดูง่ายๆ
Docker Compose มันง่าย สะดวก เหมาะกับ application ที่ไม่ซับซ้อนมาก แต่ถ้า application ใหญ่ๆ อาจจะต้องมองหาเครื่องมือที่ scale ได้ดีกว่า เช่น Kubernetes
Docker Compose scale ได้ แต่ไม่ดีเท่า Kubernetes ถ้า scale เยอะๆ อาจจะเจอปัญหาเรื่อง networking, storage, และ management
Docker Compose ปลอดภัยในระดับหนึ่ง แต่เราต้อง configure ให้ดีๆ อย่าใส่ secrets ใน docker-compose.yml, ใช้ health checks, และ monitor logs อย่างสม่ำเสมอ
อาจจะเป็นเพราะ health check fail หรือ container crash เอง ลองดู logs เพื่อหาสาเหตุ
ใช้ docker-compose pull เพื่อ download image ใหม่ แล้ว docker-compose up -d เพื่อ restart container
Docker Compose Production ไม่ใช่เรื่องยาก แต่ต้องใส่ใจในรายละเอียด ตั้งแต่เรื่อง Volumes, Environment Variables, Health Checks, ไปจนถึง Logging ถ้าทำตามเคล็ดลับที่ผมบอกไป รับรองว่า application ของน้องๆ จะทำงานได้อย่างราบรื่นแน่นอน
อย่าลืมติดตาม SiamCafe Blog นะครับ มีบทความดีๆ เกี่ยวกับ IT อีกเยอะเลย
และถ้าสนใจเรื่อง Forex ลองแวะไปดูที่ iCafeForex ได้นะครับ