คู่มือการเรียนรู้ Docker

สำหรับนักศึกษาระดับ ปวส.

สารบัญ

Docker คืออะไร

Docker คือแพลตฟอร์มที่ใช้สำหรับการพัฒนา จัดส่ง และรันแอปพลิเคชันในรูปแบบของ Container

ข้อดีของ Docker

ความแตกต่างระหว่าง Container และ Virtual Machine

คุณสมบัติ Container Virtual Machine
ขนาด เล็ก (MB) ใหญ่ (GB)
ความเร็วในการเริ่มต้น วินาที นาที
การใช้ทรัพยากร น้อย มาก
OS ใช้ร่วมกับ Host แยก OS เป็นของตัวเอง
คำถามทบทวน: Docker ใช้ทรัพยากรน้อยกว่า Virtual Machine หรือไม่ และเพราะอะไร?

คำตอบ: ใช่! Docker ใช้ทรัพยากรน้อยกว่า Virtual Machine เพราะ Container ใช้ OS ร่วมกับเครื่อง Host ไม่ต้องติดตั้ง OS แยกเหมือน VM ทำให้ประหยัดทั้ง CPU, RAM และพื้นที่จัดเก็บข้อมูล นอกจากนี้ Container ยังเริ่มทำงานได้เร็วกว่า (ใช้เวลาเพียงไม่กี่วินาที แทนที่จะเป็นหลายนาทีเหมือน VM)

การติดตั้ง Docker

สำหรับ Windows

  1. ดาวน์โหลด Docker Desktop จาก https://www.docker.com/products/docker-desktop
  2. ติดตั้งโปรแกรมและรีสตาร์ทเครื่อง
  3. เปิด PowerShell หรือ Command Prompt แล้วพิมพ์:
docker --version

สำหรับ Linux (Ubuntu)

# อัพเดทแพ็คเกจ
sudo apt update

# ติดตั้ง Docker
sudo apt install docker.io -y

# เริ่มต้น Docker service
sudo systemctl start docker
sudo systemctl enable docker

# ตรวจสอบเวอร์ชัน
docker --version
คำถามทบทวน: คำสั่งใดที่ใช้ตรวจสอบว่า Docker ติดตั้งสำเร็จแล้ว?

คำตอบ: docker --version หรือ docker version จะแสดงเวอร์ชันของ Docker ที่ติดตั้ง นอกจากนี้ยังสามารถใช้ docker run hello-world เพื่อทดสอบว่า Docker ทำงานได้ปกติหรือไม่

คำสั่งพื้นฐาน Docker

1. การดู Docker Version

docker --version
docker version

2. การทดสอบว่า Docker ทำงานได้หรือไม่

docker run hello-world

3. การดู Container ที่กำลังทำงาน

# ดูเฉพาะที่ทำงานอยู่
docker ps

# ดูทั้งหมด (รวมที่หยุดแล้ว)
docker ps -a

4. การดู Images ที่มีในเครื่อง

docker images

5. การดาวน์โหลด Image

docker pull ubuntu
docker pull nginx
docker pull node:18

6. การรัน Container

# รันแบบพื้นฐาน
docker run ubuntu

# รันแบบโต้ตอบ (Interactive)
docker run -it ubuntu bash

# รันแบบ Detached (Background)
docker run -d nginx

# รันและตั้งชื่อ Container
docker run --name my-nginx -d nginx

# รันและ map port
docker run -d -p 8080:80 nginx

7. การหยุดและลบ Container

# หยุด Container
docker stop <container-id>

# เริ่ม Container ที่หยุดไว้
docker start <container-id>

# รีสตาร์ท Container
docker restart <container-id>

# ลบ Container
docker rm <container-id>

# บังคับลบ Container ที่ทำงานอยู่
docker rm -f <container-id>
คำถามทบทวน: ถ้าต้องการรัน nginx container แบบ background และเปิด port 8080 ควรใช้คำสั่งอะไร?

คำตอบ: docker run -d -p 8080:80 nginx

คำอธิบาย:

  • -d = Detached mode (รันแบบ background)
  • -p 8080:80 = Port mapping (port 8080 บนเครื่อง host เชื่อมกับ port 80 ใน container)
  • nginx = ชื่อ image ที่จะรัน

Docker Image และ Container

Image คืออะไร

Container คืออะไร

ตัวอย่างการใช้งาน

ตัวอย่างที่ 1: รัน Nginx Web Server

# ดาวน์โหลด nginx image
docker pull nginx

# รัน nginx container และเปิด port 8080
docker run -d -p 8080:80 --name my-web nginx

# เปิดเบราว์เซอร์แล้วไปที่ http://localhost:8080

ตัวอย่างที่ 2: รัน MySQL Database

# รัน MySQL container
docker run -d \
  --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=mypassword \
  -p 3306:3306 \
  mysql:8

# เข้าใช้งาน MySQL
docker exec -it my-mysql mysql -uroot -pmypassword
คำถามทบทวน: Image กับ Container ต่างกันอย่างไร?

คำตอบ:

  • Image = เทมเพลต (Read-only) ไม่สามารถแก้ไขได้ เปรียบเหมือนแบบพิมพ์เค้ก
  • Container = Instance ที่รันจาก Image (Read-write) สามารถแก้ไขข้อมูลได้ เปรียบเหมือนเค้กที่อบออกมาจากแบบพิมพ์
  • สามารถสร้าง Container หลายๆ ตัวจาก Image เดียวกันได้

Dockerfile

Dockerfile คือไฟล์คำสั่งที่ใช้สร้าง Docker Image ของเราเอง

โครงสร้างพื้นฐาน Dockerfile

# เริ่มจาก base image
FROM ubuntu:22.04

# ข้อมูลผู้สร้าง
LABEL maintainer="your-email@example.com"

# ติดตั้งแพ็คเกจ
RUN apt-get update && apt-get install -y \
    curl \
    vim

# กำหนด working directory
WORKDIR /app

# คัดลอกไฟล์เข้า container
COPY . /app

# เปิด port
EXPOSE 80

# คำสั่งที่รันเมื่อ container เริ่มทำงาน
CMD ["echo", "Hello Docker!"]

คำสั่งที่สำคัญใน Dockerfile

คำสั่ง คำอธิบาย
FROM กำหนด base image
RUN รันคำสั่งระหว่างการ build image
COPY คัดลอกไฟล์จาก host เข้า container
WORKDIR กำหนด working directory
EXPOSE ระบุ port ที่ container จะใช้
CMD คำสั่งที่รันเมื่อ container เริ่มทำงาน

ตัวอย่าง: Dockerfile สำหรับ Node.js

FROM node:18-alpine

WORKDIR /app

# คัดลอก package.json และ install dependencies
COPY package*.json ./
RUN npm install

# คัดลอกโค้ดทั้งหมด
COPY . .

EXPOSE 3000

CMD ["node", "app.js"]

Build และ Run:

# Build image
docker build -t my-node-app .

# Run container
docker run -d -p 3000:3000 my-node-app
คำถามทบทวน: คำสั่ง COPY และ ADD ใน Dockerfile ต่างกันอย่างไร?

คำตอบ:

  • COPY - คัดลอกไฟล์และโฟลเดอร์จาก host เข้า container แบบธรรมดา (แนะนำให้ใช้)
  • ADD - ทำงานเหมือน COPY แต่มีความสามารถเพิ่มเติม:
    • ดาวน์โหลดไฟล์จาก URL ได้
    • แตกไฟล์ zip/tar อัตโนมัติ
  • Best Practice: ใช้ COPY เป็นหลัก ใช้ ADD เฉพาะเมื่อจำเป็นจริงๆ เพื่อความชัดเจน

Docker Compose

Docker Compose เป็นเครื่องมือสำหรับการกำหนดและรันหลาย Docker Container พร้อมกัน

โครงสร้างไฟล์ docker-compose.yml

version: '3.8'

services:
  web:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
  
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydb
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

คำสั่งพื้นฐาน Docker Compose

# รันทุก services
docker-compose up

# รันแบบ background
docker-compose up -d

# หยุดทุก services
docker-compose down

# ดูสถานะ
docker-compose ps

# ดู logs
docker-compose logs

ตัวอย่าง: Full Stack Application

version: '3.8'

services:
  # Frontend (React)
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    depends_on:
      - backend
  
  # Backend (Node.js)
  backend:
    build: ./backend
    ports:
      - "5000:5000"
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_USER: root
      DB_PASSWORD: secret
  
  # Database (PostgreSQL)
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: appdb
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
คำถามทบทวน: Docker Compose ช่วยอะไรเราบ้าง?

คำตอบ: Docker Compose ช่วย:

  • ✅ จัดการหลาย containers พร้อมกัน ด้วยคำสั่งเดียว
  • ✅ กำหนดค่าคอนฟิกทั้งหมดไว้ในไฟล์ docker-compose.yml
  • ✅ สร้าง network ระหว่าง containers อัตโนมัติ
  • ✅ จัดการ volumes และ environment variables ได้ง่าย
  • ✅ กำหนด dependencies ระหว่าง services (depends_on)
  • ✅ เหมาะสำหรับ development และ testing environment

แบบฝึกหัด

แบบฝึกหัดที่ 1 Basic Commands

  1. ติดตั้ง Docker บนเครื่องของคุณ
  2. รันคำสั่ง docker run hello-world และดูผลลัพธ์
  3. ดาวน์โหลด ubuntu image และรันแบบ interactive mode
  4. ลิสต์ทุก containers และ images ที่มี
  5. ลบ containers และ images ที่ไม่ใช้แล้ว

แบบฝึกหัดที่ 2 Running Services

  1. รัน nginx web server บน port 8080
  2. รัน MySQL database โดยกำหนด root password
  3. เข้าไปใน MySQL container และสร้าง database ใหม่
  4. รัน Node.js container และ mount โค้ดจาก local เข้าไป

แบบฝึกหัดที่ 3 Dockerfile

  1. สร้าง Dockerfile สำหรับ Node.js application
  2. Build image จาก Dockerfile
  3. รัน container จาก image ที่สร้าง
  4. ทดสอบว่า application ทำงานได้ปกติ

แบบฝึกหัดที่ 4 Docker Compose

  1. สร้างไฟล์ docker-compose.yml สำหรับ web app + database
  2. รัน services ทั้งหมดด้วย docker-compose
  3. ทดสอบการเชื่อมต่อระหว่าง web app กับ database
  4. หยุดและลบทุก services

แบบฝึกหัดที่ 5 โปรเจกต์จริง

สร้าง Todo List Application โดยใช้:

  • Frontend: HTML/CSS/JavaScript (รันด้วย nginx)
  • Backend: Node.js + Express
  • Database: MongoDB

ใช้ Docker Compose จัดการทั้ง 3 services และให้สามารถสื่อสารกันได้

คำถามทบทวน: ถ้าต้องการดู logs ของ container ที่กำลังรันอยู่ ใช้คำสั่งอะไร?

คำตอบ:

  • docker logs <container-id> - ดู logs ทั้งหมด
  • docker logs -f <container-id> - ดู logs แบบ real-time (follow)
  • docker logs --tail 100 <container-id> - ดู logs 100 บรรทัดล่าสุด
  • docker-compose logs - ดู logs ทุก services (ถ้าใช้ docker-compose)

เทคนิคและ Best Practices

1. การลดขนาด Image

# ใช้ alpine version
FROM node:18-alpine  # แทน FROM node:18

# ลบ cache หลัง install
RUN apt-get update && apt-get install -y \
    package1 \
    package2 \
    && rm -rf /var/lib/apt/lists/*

# ใช้ multi-stage build

2. การใช้ .dockerignore

สร้างไฟล์ .dockerignore:

node_modules
npm-debug.log
.git
.env
*.md

3. การตั้งชื่อ Image และ Container

# ใช้ชื่อที่มีความหมาย
docker build -t myapp:v1.0 .
docker run --name myapp-prod -d myapp:v1.0

4. การใช้ Environment Variables

version: '3.8'
services:
  app:
    image: myapp
    environment:
      - NODE_ENV=production
      - PORT=3000
    env_file:
      - .env

5. การใช้ Volumes

# Named volume
docker run -v mydata:/app/data myapp

# Bind mount
docker run -v $(pwd):/app myapp
คำถามทบทวน: ทำไมควรใช้ alpine version ของ base image?

คำตอบ: Alpine Linux มีขนาดเล็กมาก (ประมาณ 5MB) เมื่อเทียบกับ base image ปกติที่มีขนาดหลัก 100MB ขึ้นไป ข้อดี:

  • ✅ ลดขนาด image ทำให้ download เร็วขึ้น
  • ✅ ใช้พื้นที่จัดเก็บน้อยลง
  • ✅ มีช่องโหว่ด้านความปลอดภัยน้อยลง (มี package น้อยกว่า)
  • ✅ Deploy เร็วขึ้น

ข้อควรระวัง: บาง library อาจไม่รองรับ Alpine ต้องติดตั้งเพิ่มเติม

คำสั่งที่ใช้บ่อย (Cheat Sheet)

Container Management

docker ps                          # ดู containers ที่รันอยู่
docker ps -a                       # ดูทุก containers
docker start <container>           # เริ่ม container
docker stop <container>            # หยุด container
docker restart <container>         # รีสตาร์ท container
docker rm <container>              # ลบ container
docker rm -f <container>           # บังคับลบ container

Image Management

docker images                      # ดูทุก images
docker pull <image>                # ดาวน์โหลด image
docker rmi <image>                 # ลบ image
docker build -t <name> .           # build image
docker tag <image> <new-name>      # tag image

Container Logs & Info

docker logs <container>            # ดู logs
docker logs -f <container>         # ดู logs แบบ real-time
docker inspect <container>         # ดูข้อมูลเต็ม
docker stats                       # ดูการใช้ทรัพยากร
docker exec -it <container> bash   # เข้าไปใน container

System Cleanup

docker system prune                # ลบสิ่งที่ไม่ใช้
docker container prune             # ลบ containers ที่หยุดแล้ว
docker image prune                 # ลบ images ที่ไม่มี tag
docker volume prune                # ลบ volumes ที่ไม่ใช้

Docker Compose

docker-compose up                  # รัน services
docker-compose up -d               # รันแบบ background
docker-compose down                # หยุดและลบ services
docker-compose ps                  # ดูสถานะ services
docker-compose logs                # ดู logs
docker-compose build               # build images
คำถามท้าทาย: ถ้าต้องการลบทุกอย่างที่ไม่ได้ใช้งาน (containers, images, volumes) ในคำสั่งเดียว ควรใช้คำสั่งอะไร?

คำตอบ: docker system prune -a --volumes

คำอธิบาย:

  • docker system prune - ลบ containers ที่หยุดแล้ว, networks ที่ไม่ใช้, images ที่ dangling
  • -a - ลบ images ทั้งหมดที่ไม่มี container ใช้งาน
  • --volumes - ลบ volumes ที่ไม่ได้ใช้งานด้วย

⚠️ คำเตือน: คำสั่งนี้จะลบข้อมูลถาวร ใช้ด้วยความระมัดระวัง!

แหล่งเรียนรู้เพิ่มเติม

สรุป

Docker เป็นเครื่องมือที่สำคัญในยุคปัจจุบันสำหรับการพัฒนาและ deploy แอปพลิเคชัน การเรียนรู้ Docker จะช่วยให้:

🚀 เริ่มต้นฝึกฝนวันนี้เลย! 🚀

เอกสารนี้จัดทำขึ้นเพื่อการศึกษาสำหรับนักศึกษาระดับ ปวส.

© 2026 Docker Learning Guide | Powered by Glassmorphism Design