สำหรับเพื่อน ๆ ที่เคย Deploy โปรเจกต์ขึ้น Server แล้วเจอปัญหา “ก็มันรันได้บนเครื่องฉันนะ!” (It works on my machine!) บอกเลยว่าไม่ได้อยู่คนเดียวนะคร้าบบ ปัญหานี้เป็นหนึ่งใน pain point ที่ Developer ทั่วโลกเจอมาตลอด ไม่ว่าจะเป็นเรื่อง environment ที่ต่างกัน, dependency version ไม่ตรง, หรือ config ที่หายไปตอน deploy
จากข้อมูล Stack Overflow Developer Survey 2025 ที่สำรวจนักพัฒนากว่า 49,000 คนจาก 177 ประเทศ พบว่า Docker มีอัตราการใช้งานพุ่งขึ้นถึง 71.1% เพิ่มขึ้น 17% ในปีเดียว ซึ่งเป็นการเติบโตมากที่สุดของเทคโนโลยีใด ๆ ใน Survey นี้เลย และจากรายงานของ Docker เอง พบว่า IT professionals มีอัตราการใช้ Container สูงถึง 92% ในปี 2025
บทความนี้แอดจะพาเพื่อน ๆ มาทำความเข้าใจ Docker และ CI/CD Pipeline ตั้งแต่ concept ง่าย ๆ ไปจนถึงลงมือทำจริง เพื่อให้ทุกครั้งที่ push code แล้ว deploy ขึ้นจริง จะไม่ต้องมานั่งลุ้นว่าจะพังหรือไม่พังอีกต่อไปน้าาา

Docker คืออะไร? อธิบายแบบที่คนไม่เคยใช้ก็เข้าใจ
ลองนึกภาพว่าเราจะย้ายบ้าน ถ้าต้องขนของทีละชิ้น โต๊ะก็ไปทาง เก้าอี้ก็ไปทาง ของอาจหายหรือเสียหายระหว่างทางได้ แต่ถ้าเราเอาทุกอย่างใส่ “ตู้คอนเทนเนอร์” แบบเดียวกับที่ใช้ขนส่งสินค้าทางเรือ ทุกอย่างจะถูกแพ็คไว้ด้วยกันอย่างเป็นระเบียบ ย้ายไปที่ไหนก็ได้โดยไม่ต้องกังวลว่าของจะหาย
Docker ก็ทำงานแบบเดียวกัน มันเป็นเครื่องมือที่ช่วย “แพ็ค” แอปพลิเคชันพร้อมทุกสิ่งที่ต้องใช้ในการรัน ไม่ว่าจะเป็น runtime, library, config file, environment variable ทุกอย่างถูกรวมไว้ใน Container เดียว ซึ่งสามารถนำไปรันบนเครื่องไหนก็ได้ที่มี Docker ติดตั้งอยู่ ผลลัพธ์จะออกมาเหมือนกันเป๊ะ ๆ
หัวใจสำคัญของ Docker มีอยู่ 3 อย่างที่ต้องรู้จักคือ Dockerfile, Image และ Container
Dockerfile คือ “สูตรอาหาร” ที่บอกว่าต้องใช้วัตถุดิบอะไรบ้าง ติดตั้งอะไร ตั้งค่าอะไร Image คือ “อาหารที่ทำเสร็จแล้วแต่ยังไม่ได้เสิร์ฟ” เป็น snapshot ที่พร้อมใช้งาน และ Container คือ “จานอาหารที่กำลังเสิร์ฟ” หรือก็คือ Image ที่กำลังรันอยู่นั่นเอง
มาดู Dockerfile ตัวอย่างง่าย ๆ สำหรับแอป Node.js กัน
# Dockerfile สำหรับ Node.js app
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]JSONแค่ไฟล์เดียวนี้ก็บอกทุกอย่างที่ Docker ต้องรู้เพื่อสร้าง Container สำหรับแอปของเราแล้วคร้าบบ ไม่ต้องมานั่งบอกเพื่อนร่วมทีมว่า “ติดตั้ง Node version นี้นะ”, “อย่าลืม run npm install ด้วย” อีกต่อไป

แล้วเจ้า CI/CD Pipeline คืออะไร? ทำไมถึงช่วยให้ Deploy ไม่พัง
ถ้า Docker คือ “ตู้คอนเทนเนอร์” ที่แพ็คแอปของเรา CI/CD ก็คือ “สายพานลำเลียง” ที่ช่วยส่งตู้คอนเทนเนอร์นั้นจากโรงงาน (เครื่อง Dev) ไปถึงท่าเรือ (Production Server) อย่างอัตโนมัติ ปลอดภัย และสม่ำเสมอ
CI (Continuous Integration) คือกระบวนการที่ทุกครั้งที่มีคน push code เข้า repository ระบบจะทำการ build และ test อัตโนมัติทันที ถ้ามี bug หรือ test ไม่ผ่าน จะรู้ทันทีไม่ต้องรอไปเจอตอน deploy ซึ่งจากรายงานปี 2025 พบว่า CI/CD Pipeline ที่ออกแบบไม่ดีถึง 80% ล้มเหลวในการส่งมอบตามที่สัญญาไว้ เพราะปัญหาหลักมาจากการไม่มี automated testing ที่ครบถ้วน
CD (Continuous Deployment/Delivery) คือขั้นตอนถัดมา ถ้า CI ผ่านหมดแล้ว ระบบจะ deploy โค้ดขึ้น staging หรือ production ให้อัตโนมัติ ไม่ต้องนั่ง SSH เข้า server แล้ว pull code เอง ไม่ต้องกลัวลืม restart service และที่สำคัญ ลดโอกาสผิดพลาดจาก human error ได้มหาศาลเลยย
ปัจจุบัน GitHub Actions รันมากกว่า 5 ล้าน workflows ต่อวัน เพิ่มขึ้น 40% จากปีก่อน และ Continuous Deployment ผ่าน GitHub Actions เพิ่มขึ้นถึง 50% จากทีมที่ push code ขึ้น production โดยอัตโนมัติ แสดงให้เห็นว่า CI/CD ไม่ใช่แค่ trend แต่กลายเป็นมาตรฐานของการพัฒนาซอฟต์แวร์ไปแล้ว

มาลองลงมือทำ สร้าง Docker Container แรกของเรา
เลิกพูดทฤษฎีกันแล้ว มาลองทำจริงกันเลยดีกว่าคร้าบบ สมมุติว่าเรามีแอป Node.js + Express แบบง่าย ๆ
ขั้นตอนที่ 1: สร้างแอปตัวอย่าง (ตัวนี้เป็น Express.js)
// server.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({
message: 'Hello from Docker!',
environment: process.env.NODE_ENV || 'development',
timestamp: new Date().toISOString()
});
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});JSONขั้นตอนที่ 2: สร้าง Dockerfile
ใช้ multi-stage build เพื่อให้ image เล็กและปลอดภัย
# ใช้ Node 20 Alpine เป็น base (image เล็ก ~50MB)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "server.js"]JSONขั้นตอนที่ 3: Build และ Run
# Build image
docker build -t my-app:1.0 .JSONผลลัพธ์จะได้ประมาณนี้

ต่อมาให้ทำการสั่ง Run Container ตามคำสั่งนี้
# Run container
docker run -d -p 3000:3000 --name my-app my-app:1.0JSONหลังจากรันแล้วก็จะเห็นหน้าจอประมาณนี้

หลังจากนั้นเราก็จะมาทำการเช็คกันว่ามันรันแล้วจริง ๆ ใช่มั้ยด้วยคำสั่งนี้ ก็จะได้ผลลัพธ์ตามภาพตัวอย่างด้านล่างเลย
# เช็คว่ารันแล้ว
curl http://localhost:3000JSON
เพียงเท่านี้ แอปของเราก็รันอยู่ใน Container แล้ว จะเอาไปรันบนเครื่องเพื่อนร่วมทีม บน Server อื่น หรือบน Cloud ก็ได้ผลลัพธ์เหมือนกันเป๊ะ ๆ เลยย ปัญหา “บนเครื่องฉันรันได้” หายไปเลยคร้าบบ
ต่อท่อ CI/CD ด้วย GitHub Actions แบบ Step-by-Step
ตอนนี้เรามี Docker Container แล้ว ขั้นตอนถัดไปคือทำให้ทุกครั้งที่ push code ระบบ build, test และ deploy ให้อัตโนมัติ เราจะใช้ GitHub Actions ซึ่งเป็น CI/CD ที่ใช้งานง่ายมาก ๆ และฟรีสำหรับ public repo แค่สร้างไฟล์ YAML ไว้ใน repository ก็พร้อมใช้งานได้เลย
สร้างไฟล์ .github/workflows/deploy.yml ในโปรเจกต์ของเรา
# .github/workflows/deploy.yml
name: Build and Deploy
on:
push:
branches: [main] # ทำงานเมื่อ push เข้า main
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build Docker image
run: docker build -t my-app:${{ github.sha }} .JSONแค่นี้เลย ทุกครั้งที่ push code เข้า branch main ระบบจะ checkout code, ติดตั้ง dependencies, รัน test และ build Docker image ให้อัตโนมัติ ถ้า test ไม่ผ่าน Pipeline จะหยุดทันที ไม่ปล่อยให้โค้ดที่พังไปถึง production
แอดขอแนะนำเทคนิคเพิ่มเติมอีกนิดนะคร้าบบ สำหรับ production จริง ๆ ให้เพิ่ม step สำหรับ push image ไป Container Registry (เช่น Docker Hub หรือ GitHub Container Registry) แล้วค่อย deploy ไปยัง server ปลายทาง ซึ่งจะทำให้ flow สมบูรณ์ยิ่งขึ้น

Docker Compose สำหรับโปรเจกต์จริง: จัดการหลาย Service ในคำสั่งเดียว
ในโปรเจกต์จริง แอปของเราไม่ได้มีแค่ตัวเดียว อาจจะมี Web Server, Database, Redis Cache, หรือแม้แต่ Message Queue ถ้าต้องมานั่ง docker run ทีละตัว คง ปวดหัวน่าดู Docker Compose ช่วยแก้ปัญหานี้โดยให้เราเขียน config ไฟล์เดียว แล้วสั่ง docker compose up ทุก service ก็พร้อมรันพร้อมกัน
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- '3000:3000'
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:16-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:JSONแค่สั่ง docker compose up -d ก็ได้ทั้ง Node.js app และ PostgreSQL database พร้อมใช้งานทันที ส่วนเวลาจะปิดก็แค่ docker compose down ง่ายมาก ๆ เลยย แล้วสิ่งที่เจ๋งคือ developer คนใหม่ที่เข้ามาในทีม แค่ clone repo แล้ว docker compose up ก็พร้อมเริ่มทำงานได้เลย ไม่ต้องมานั่ง setup environment เป็นชั่วโมงอีกต่อไป

เปรียบเทียบ: Deploy แบบเดิม vs Docker + CI/CD
เพื่อให้เห็นภาพชัดขึ้นว่า Docker + CI/CD เปลี่ยนชีวิต Developer ยังไงบ้าง มาดูตารางเปรียบเทียบกัน
| หัวข้อ | Deploy แบบเดิม (Manual) | Docker + CI/CD |
| Setup Environment | ติดตั้งทีละตัว ใช้เวลาหลายชั่วโมง | docker compose up เสร็จใน 2 นาที |
| “Works on my machine” | เจอบ่อยมาก | หมดปัญหา (Container เหมือนกันทุกที่) |
| Deploy Process | SSH เข้า server, git pull, restart | Push code แล้วรอ (อัตโนมัติ) |
| Rollback | กลับ version เก่าด้วยมือ เสี่ยงพลาด | กลับ image เก่าได้ทันที |
| Testing | ลืมเทสต์บ่อย (เป็นมนุษย์) | Test อัตโนมัติทุกครั้งที่ push |
| Consistency | แต่ละ server อาจต่างกัน | ทุก server เหมือนกัน 100% |
| Onboard คนใหม่ | ใช้เวลา 1-2 วัน setup | Clone + docker compose up จบ |
| ความเสี่ยง | Human error สูง | ลดลงอย่างมากจาก automation |
สรุป: เริ่มต้นใช้ Docker + CI/CD วันนี้
สำหรับเพื่อน ๆ ที่อ่านมาถึงตรงนี้ จะเห็นว่า Docker และ CI/CD ไม่ได้น่ากลัวหรือยากอย่างที่คิดเลย หัวใจสำคัญคือ Docker ช่วยให้เราแพ็คแอปพร้อม environment ไว้ด้วยกัน ส่วน CI/CD ช่วยให้ทุก process ตั้งแต่ test จนถึง deploy เป็นอัตโนมัติ ทั้งสองอย่างทำงานร่วมกันเพื่อให้การ deploy ไม่ใช่เรื่องน่ากลัวอีกต่อไป
จากที่แอดใช้งานมา สิ่งที่เปลี่ยนชีวิตมากที่สุดคือ ความมั่นใจตอน deploy ถ้าก่อนหน้านี้ทุกครั้งที่สั่ง deploy ต้องนั่งลุ้นว่าจะพังไหม ตอนนี้แค่ push code แล้วก็ไปทำอย่างอื่นได้เลย เพราะรู้ว่า Pipeline จะ test ให้ build ให้ deploy ให้ และถ้ามีปัญหาจะแจ้งเตือนทันที
แอดแนะนำว่าเริ่มจากเล็ก ๆ ก่อน ลอง Dockerize โปรเจกต์ส่วนตัวสักตัว แล้วค่อยเพิ่ม GitHub Actions เข้าไป ทำไปทีละ step ไม่ต้องรีบ แต่ที่สำคัญคือเริ่มน้าาา เพราะทักษะเหล่านี้เป็นสิ่งที่ตลาดต้องการจริง ๆ ในปี 2026
สำหรับเพื่อน ๆ ที่อยากเรียนรู้ Docker, CI/CD และทักษะ Full Stack อื่น ๆ แบบเป็นระบบ ลองดู Full Stack Developer Package 2026 จาก borntoDev ที่สอนตั้งแต่พื้นฐานจนถึง Deploy ขึ้นจริง ครอบคลุมทั้ง Front-End และ Back-End ในแพ็กเกจเดียว
👉 ดูรายละเอียด Full Stack Developer Package 2026

แหล่งอ้างอิง (References)
Stack Overflow Developer Survey 2025 survey.stackoverflow.co/2025/
Docker 2025 State of App Dev: Key Insights docker.com/blog/2025-docker-state-of-app-dev/
GitHub Actions Documentation docs.github.com/en/actions
Why 80% of CI/CD Pipelines Fail in 2025 markaicode.com
บทความที่เกี่ยวข้องจาก borntoDev:
Roadmap Full Stack 2026: จาก HTML สู่ Deploy ขึ้นจริง
ว่าด้วยเรื่อง Web Testing สำหรับคนไม่ชอบเทสต์
API ที่ดีไม่ใช่แค่ทำงานได้: Checklist ออกแบบ API ให้ทีมโตได้