0

รู้จัก Docker + CI/CD แบบง่าย ๆ ทำให้ Deploy ไม่พังทุกครั้งที่แก้โค้ด

สำหรับเพื่อน ๆ ที่เคย 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 ขึ้นจริง จะไม่ต้องมานั่งลุ้นว่าจะพังหรือไม่พังอีกต่อไปน้าาา

Image show important number in docker terms

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 ด้วย” อีกต่อไป

แผนภาพแสดง Workflow การทำงานของ Docker เริ่มจาก Dockerfile (สูตรอาหาร) ทำการ Build เป็น Image (อาหารพร้อมเสิร์ฟ) แล้วสั่ง Run เป็น Container (กำลังให้บริการ) โดยมีการ Pull/Push Image กับ Docker Hub

แล้วเจ้า 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 แต่กลายเป็นมาตรฐานของการพัฒนาซอฟต์แวร์ไปแล้ว

แผนภาพแสดง CI/CD Pipeline 5 ขั้นตอน เริ่มตั้งแต่ 1. การ Push Code 2. การ Build ใน Docker 3. การทำ Automated Tests 4. การ Deploy ขึ้น Stage 5. การ Deploy ขึ้น Production

มาลองลงมือทำ สร้าง 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

ผลลัพธ์จะได้ประมาณนี้

ภาพแสดงผลลัพธ์จากการใส่คำสั่งเพื่อ Build image บน Terminal

ต่อมาให้ทำการสั่ง Run Container ตามคำสั่งนี้

# Run container
docker run -d -p 3000:3000 --name my-app my-app:1.0
JSON

หลังจากรันแล้วก็จะเห็นหน้าจอประมาณนี้

ภาพแสดงผลลัพธ์จากการรันคำสั่งเพื่อ Run Container บน Terminal

หลังจากนั้นเราก็จะมาทำการเช็คกันว่ามันรันแล้วจริง ๆ ใช่มั้ยด้วยคำสั่งนี้ ก็จะได้ผลลัพธ์ตามภาพตัวอย่างด้านล่างเลย

# เช็คว่ารันแล้ว
curl http://localhost:3000
JSON
ภาพแสดงผลลัพธ์สุดท้าย หลังการใส่คำสั่งตรวจสอบ เพื่อเช็คว่า Container ของเราเริ่มทำงานแล้วหรือยัง

เพียงเท่านี้ แอปของเราก็รันอยู่ใน 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 สมบูรณ์ยิ่งขึ้น

แผนภาพแสดง GitHub Actions Workflow เริ่มตั้งแต่ Developer ทำการ Push Code ขึ้น Branch ไปจนถึง Deploy ขึ้น Server

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 เป็นชั่วโมงอีกต่อไป

แผนภาพแสดง Docker Compose Architecture โครงสร้างการทำงานระหว่าง App Container, DB Container และ Cache Container ผ่าน Docker Network

เปรียบเทียบ: 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 ProcessSSH เข้า server, git pull, restartPush code แล้วรอ (อัตโนมัติ)
Rollbackกลับ version เก่าด้วยมือ เสี่ยงพลาดกลับ image เก่าได้ทันที
Testingลืมเทสต์บ่อย (เป็นมนุษย์)Test อัตโนมัติทุกครั้งที่ push
Consistencyแต่ละ server อาจต่างกันทุก server เหมือนกัน 100%
Onboard คนใหม่ใช้เวลา 1-2 วัน setupClone + 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

ภาพโปรโมทหลักสูตร Full Stack Developer Package 2026 พร้อมลิงก์เข้าสู่หน้ารายละเอียดหลักสูตร

แหล่งอ้างอิง (References)

Stack Overflow Developer Survey 2025 survey.stackoverflow.co/2025/

Docker State of Application Development Survey 2025 docker.com/blog/state-of-application-development-survey-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 ให้ทีมโตได้

0

แนะนำสำหรับคุณ

คัดลอกลิงก์สำเร็จ