DevOps
น้องๆ หลายคนอาจจะคุ้นเคยกับ Docker Compose ในการพัฒนาโปรแกรมบนเครื่องตัวเอง แต่พอจะเอาขึ้น Production จริงจัง กลับงงเต็ก ไม่รู้จะเริ่มตรงไหนดี ใช่มั้ยล่ะ? สมัยผมทำร้านเน็ต SiamCafe สมัยก่อน (ตั้งแต่ปี 97 นะ!) เราก็ต้อง Deploy ระบบเองหมดทุกอย่าง ไม่มีเครื่องมือดีๆ แบบนี้ให้ใช้เลยนะ ต้องเขียน Script เองหมด
Docker Compose Production Guide เนี่ย ก็คือคู่มือที่เราจะมาดูกันว่า เราจะเอา Docker Compose ไปใช้ใน Production ได้ยังไง ให้มันเสถียร ปลอดภัย และดูแลรักษาง่าย ไม่ใช่แค่รัน docker-compose up แล้วจบนะน้อง มันมีอะไรมากกว่านั้นเยอะ!
ทำไมมันถึงสำคัญน่ะเหรอ? ลองนึกภาพนะ ถ้าเว็บเรามี Traffic เยอะๆ แล้ว Server ล่มขึ้นมา จะทำยังไง? ถ้าใช้ Docker Compose เป็นอย่างดี เราสามารถ Scale ระบบได้ง่ายๆ แก้ปัญหาได้รวดเร็ว และลด Downtime ได้เยอะมาก สมัยนี้ใครไม่ใช้ Docker นี่ถือว่าตามหลังคนอื่นไปเยอะเลยนะ
ง่ายๆ เลย Docker คือ Containerization Technology ที่ช่วยให้เรา Package application พร้อม dependencies ทุกอย่างลงใน Container เดียวกัน ทำให้ Application เราทำงานได้เหมือนกันทุกที่ ไม่ว่าจะบนเครื่องเรา บน Server หรือบน Cloud
สมัยก่อนนะ เวลาเราจะย้าย Application จากเครื่อง Developer ไป Server มักจะมีปัญหา Dependencies ไม่ตรงกัน Library Version ไม่เท่ากัน แต่พอใช้ Docker ปัญหาพวกนี้ก็หายไปเลย เพราะทุกอย่างมันอยู่ใน Container เดียวกันแล้ว
Docker Compose คือเครื่องมือที่ช่วยให้เราจัดการหลายๆ Docker Container พร้อมกันได้ง่ายขึ้น โดยเราจะเขียน Configuration เป็นไฟล์ YAML บอกว่าเรามี Container อะไรบ้าง แต่ละ Container มี Dependencies อะไรบ้าง แล้ว Docker Compose จะจัดการสร้างและรัน Container เหล่านั้นให้เรา
นึกภาพตามนะ ถ้าเรามี Application ที่ต้องใช้ Web Server, Database และ Cache Server เราก็ต้องสร้าง Docker Container 3 อัน แล้ว Config ให้มันคุยกัน Docker Compose จะช่วยให้เราทำทั้งหมดนี้ได้ง่ายขึ้นเยอะเลย
ลองดูตัวอย่าง Docker Compose file ง่ายๆ:
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:14
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
Code snippet นี้จะสร้าง 2 Containers คือ Web Server (nginx) และ Database (Postgres) แล้ว Map Port 80 ของ Container Web ไปที่ Port 80 ของ Host machine
ก่อนอื่นเลย น้องๆ ต้องมี Docker และ Docker Compose ติดตั้งบน Server ก่อนนะ วิธีการติดตั้งก็ขึ้นอยู่กับ Operating System ที่ใช้ แต่โดยทั่วไปแล้วจะง่ายมากๆ ลอง Search ใน Google ดูได้เลย
เมื่อติดตั้งเรียบร้อยแล้ว เราก็จะมาเริ่มสร้าง Docker Compose file กัน
อย่างแรกเลย เราต้องสร้างไฟล์ docker-compose.yml (หรือ docker-compose.yaml) ขึ้นมา ไฟล์นี้จะเป็นตัวบอกว่าเรามี Services อะไรบ้าง แต่ละ Service ใช้ Image อะไร มี Port อะไรบ้าง
ลองดูตัวอย่าง Docker Compose file ที่ซับซ้อนขึ้น:
version: "3.9"
services:
web:
image: your-web-app:latest
ports:
- "80:80"
depends_on:
- db
environment:
DATABASE_URL: postgres://user:password@db:5432/dbname
restart: always
db:
image: postgres:14
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
restart: always
volumes:
db_data:
จาก Code snippet นี้ เรามี Service 2 อัน คือ web (Web Application ของเรา) และ db (Postgres Database)
depends_on บอกว่า Service web ต้องรอให้ Service db พร้อมใช้งานก่อนenvironment กำหนด Environment Variables ที่ Service web จะใช้restart: always บอกให้ Docker Restart Container อัตโนมัติ ถ้า Container ล่มvolumes ใช้สำหรับ Persistent data storageเมื่อเรามี Docker Compose file แล้ว เราก็สามารถ Deploy Application ได้ง่ายๆ ด้วยคำสั่ง docker-compose up -d คำสั่งนี้จะสร้างและรัน Containers ทั้งหมดใน Background
แต่แค่นี้ยังไม่พอ เราต้อง Monitoring Application ของเราด้วย เพื่อดูว่ามันทำงานเป็นปกติหรือเปล่า มี Error อะไรเกิดขึ้นบ้าง
เราสามารถใช้เครื่องมืออย่าง Prometheus และ Grafana เพื่อ Monitoring Docker Containers ได้
ลองดูตัวอย่าง Prometheus Configuration:
scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['localhost:9090']
Code snippet นี้จะบอกให้ Prometheus ไปเก็บ Metrics จาก Docker Containers ที่ localhost port 9090
การจัดการ Logs เป็นสิ่งสำคัญมากๆ ใน Production เพราะ Logs จะช่วยให้เรา Debug ปัญหาต่างๆ ได้ง่ายขึ้น
เราสามารถใช้เครื่องมืออย่าง ELK Stack (Elasticsearch, Logstash, Kibana) เพื่อจัดการ Logs ของ Docker Containers ได้
ถ้าสนใจเรื่อง Logs เพิ่มเติม ลองไปอ่านบทความใน SiamCafe Blog ดูนะ ผมเคยเขียนไว้เมื่อนานมาแล้ว
Docker Compose ไม่ใช่เครื่องมือเดียวที่เราใช้ Deploy Application ได้ ยังมีทางเลือกอื่นๆ อีกมากมาย เช่น Kubernetes, Swarm และ Serverless Functions
แต่ละทางเลือกก็มีข้อดีข้อเสียต่างกัน ขึ้นอยู่กับความต้องการและความซับซ้อนของ Application ของเรา
| เครื่องมือ | ข้อดี | ข้อเสีย | เหมาะสำหรับ |
|---|---|---|---|
| Docker Compose | ใช้งานง่าย เหมาะสำหรับ Applications ขนาดเล็กถึงกลาง | ไม่เหมาะสำหรับ Applications ขนาดใหญ่ที่มีความซับซ้อนสูง | Applications ที่มี Service ไม่เยอะ และต้องการความรวดเร็วในการ Deploy |
| Kubernetes | Scalable, Resilient, รองรับ Applications ขนาดใหญ่ที่มีความซับซ้อนสูง | Config ซับซ้อน, ต้องการความรู้ความเข้าใจสูง | Applications ขนาดใหญ่ที่มี Traffic เยอะ และต้องการความเสถียรสูง |
| Swarm | ใช้งานง่ายกว่า Kubernetes, เหมาะสำหรับ Applications ขนาดกลาง | Features น้อยกว่า Kubernetes | Applications ที่ต้องการความง่ายในการใช้งาน แต่ยังต้องการความ Scalable ในระดับหนึ่ง |
| Serverless Functions | ไม่ต้องจัดการ Server, Pay-as-you-go | เหมาะสำหรับ Applications ที่มี Event-driven และ Stateless | Applications ที่ต้องการ Scale อัตโนมัติ และไม่ต้องการจัดการ Server |
สมัยผมทำร้านเน็ต SiamCafe ผมเคยลองใช้ Swarm นะ เพราะมันง่ายกว่า Kubernetes เยอะ แต่สุดท้ายก็ต้อง Migrate ไป Kubernetes เพราะ Application เรามันซับซ้อนขึ้นเรื่อยๆ
หวังว่าน้องๆ จะได้ไอเดียในการ Deploy Application ด้วย Docker Compose ใน Production นะ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย หรือจะลองเข้าไปดูบทความอื่นๆ ใน SiamCafe Blog ก็ได้นะ
ดูวิดีโอเพิ่มเติมเกี่ยวกับDocker Compose Production Guid:
เอาล่ะ มาถึงส่วนที่สำคัญที่สุด นั่นคือเคล็ดลับที่ผมสั่งสมมาจากการทำร้านเน็ตเมื่อ 20 กว่าปีก่อน (โอ้โห นานขนาดนั้นเลย!) และประสบการณ์ด้าน IT อีกเพียบ ที่เอามาประยุกต์ใช้กับ Docker Compose ใน Production ได้อย่างลงตัว
จำไว้ว่า Docker Compose มันสะดวกจริง แต่ก็ต้องใช้ให้ถูกวิธี ไม่งั้นเจอปัญหาปวดหัวแน่นอน สมัยผมทำร้านเน็ตนะ กว่าจะแก้ปัญหาเครื่องลูกข่ายแต่ละที เล่นเอาเหงื่อตก ดังนั้น กันไว้ดีกว่าแก้เสมอ!
เรื่อง Network นี่สำคัญสุดๆ ใน Production สมัยก่อนร้านเน็ตผมล่มเพราะ Network นี่แหละ! Docker Compose ก็เหมือนกัน ต้องจัดการ Network ให้ดี สร้าง Network เฉพาะให้แต่ละ Application ไปเลย อย่าปล่อยให้มันใช้ Default Network มั่วซั่ว
version: "3.9"
services:
web:
image: nginx:latest
networks:
- my-network
networks:
my-network:
driver: bridge
โค้ดข้างบนนี่คือตัวอย่างง่ายๆ สร้าง Network ชื่อ `my-network` แล้วให้ Container `web` เข้าไปใช้แค่นั้นเอง ง่ายๆ แต่สำคัญมาก
Volume คือที่เก็บข้อมูลแบบถาวรของ Container ถ้าไม่จัดการ Volume ให้ดี ข้อมูลหายหมด! สมัยผมทำร้านเน็ต เคยมีลูกค้าทำรายงานหายเพราะไฟดับ (สมัยนั้น UPS ไม่ค่อยดี) ลูกค้าโกรธมาก! Docker Compose ก็เหมือนกัน ต้อง Mount Volume ให้ถูกต้อง
version: "3.9"
services:
db:
image: postgres:latest
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
โค้ดนี้จะสร้าง Volume ชื่อ `db_data` แล้ว Mount เข้าไปใน `/var/lib/postgresql/data` ของ Container `db` ทำให้ข้อมูล Database ไม่หายไปไหน ถึง Container จะ Restart ก็ตาม
Health Check คือการตรวจสอบว่า Container ของเรายังทำงานอยู่ดีหรือไม่ ถ้า Container ตาย Docker Compose จะ Restart ให้เอง อัตโนมัติ! สมัยก่อนร้านเน็ต ผมต้องคอยเดินดูเครื่องลูกข่ายทีละเครื่อง เหนื่อยมาก! Docker Compose ช่วยได้เยอะ
version: "3.9"
services:
web:
image: nginx:latest
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
interval: 30s
timeout: 10s
retries: 3
โค้ดนี้จะใช้ `curl` เช็คว่า Web Server ยังตอบสนองอยู่หรือไม่ ถ้าไม่ตอบสนอง 3 ครั้งติดกัน Docker Compose จะ Restart Container ให้
Docker Compose อาจจะไม่ใช่ Tool ที่ดีที่สุดสำหรับ Production ใน Scale ใหญ่มากๆ แต่สำหรับ Project ขนาดเล็กถึงกลาง หรือ Development Environment มัน Work มาก! Config ง่าย Deploy เร็ว แถมยังจัดการ Dependencies ได้ดีอีกด้วย
หลักๆ เลยคือเรื่อง Security และ Monitoring ต้อง Monitor Log, CPU, Memory ให้ดี และต้อง Secure Container ให้ปลอดภัย อย่าเปิด Port พร่ำเพรื่อ และใช้ Image ที่ Verified แล้วเท่านั้น
Docker Compose เหมาะกับ Application ที่ไม่ซับซ้อนมาก และ Run บน Server เดียว ส่วน Kubernetes เหมาะกับ Application ที่ซับซ้อนมากๆ และ Run บน Cluster หลาย Server Kubernetes Scale ได้ดีกว่า แต่ก็ Config ยากกว่าเยอะ
ตอนนี้ยังไม่มีครับ แต่เข้าไปอ่านบทความอื่นๆ ใน SiamCafe Blog ได้เลย ผมเขียนไว้เยอะแยะ หรือไม่ก็ลองไปดูคอร์ส iCafeForex เผื่อสนใจลงทุน Forex ก็ได้นะ!
Docker Compose เป็น Tool ที่มีประโยชน์มากในการ Deploy Application โดยเฉพาะอย่างยิ่งใน Development Environment หรือ Project ขนาดเล็กถึงกลาง แต่การใช้งานใน Production ต้องระมัดระวังเรื่อง Security และ Monitoring เป็นพิเศษ ถ้าทำได้ตามที่ผมแนะนำไป รับรองว่าชีวิตง่ายขึ้นเยอะ!