Skip to content

Docker คืออะไร

Docker เป็นแพลตฟอร์มสำหรับพัฒนา แพ็คเกจ และรันแอปพลิเคชันในสภาพแวดล้อมที่แยกออกจากกันเรียกว่า container โดยมีลักษณะสำคัญดังนี้:

Docker vs VM Architecture

เปรียบเทียบDocker ContainerVirtual Machine
สถาปัตยกรรมใช้ Docker Engine บน Host OSใช้ Hypervisor จำลองฮาร์ดแวร์
ระบบปฏิบัติการแชร์ kernel ของ Host OSมี Guest OS เต็มรูปแบบ
ทรัพยากรระบบใช้ทรัพยากรน้อยใช้ทรัพยากรมาก
เวลาเริ่มต้นวินาทีนาที
ประสิทธิภาพใกล้เคียง Nativeมี Overhead
ขนาดMBGB
ข้อดีหลัก- ประสิทธิภาพสูง
- ใช้ทรัพยากรน้อย
- พกพาง่าย
- รวดเร็ว
- ความปลอดภัยสูง
- รัน OS เต็มรูปแบบได้
เทคโนโลยีContainerization (แยกสภาพแวดล้อมแบบเบา)Hardware Virtualization
Portabilityทำงานเหมือนกันทุกสภาพแวดล้อมขึ้นอยู่กับ Hypervisor
Isolationแยกระบบไฟล์, network, process spaceแยกระบบสมบูรณ์
Standardizationมาตรฐานการแพ็คเกจและรันแอปขึ้นอยู่กับการตั้งค่า VM

ข้อได้เปรียบหลักของ Docker:

  • ประสิทธิภาพสูง เนื่องจากไม่ต้องรัน OS เต็มรูปแบบ

  • ใช้ทรัพยากรน้อย หลาย container แชร์ kernel เดียวกัน

  • พกพาง่าย รันได้เหมือนกันทุกที่ที่มี Docker Engine

  • รวดเร็ว เริ่มต้นและหยุดทำงานได้ทันที

  • Containerization Technology: ใช้เทคโนโลยีการแยกสภาพแวดล้อมแบบเบา (lightweight) ที่ใช้ kernel ของระบบปฏิบัติการร่วมกัน

  • Portability: แอปพลิเคชันที่ทำงานใน Docker container จะทำงานได้เหมือนกันทุกสภาพแวดล้อม (Development, Staging, Production)

  • Isolation: แต่ละ container มีระบบไฟล์, network, และ process space เป็นของตัวเอง

  • Efficiency: ใช้ทรัพยากรน้อยกว่า Virtual Machine เพราะไม่ต้องรัน OS เต็มรูปแบบในแต่ละ container

  • Standardization: กำหนดมาตรฐานการแพ็คเกจและรันแอปพลิเคชัน

เมื่อไหร่ควรใช้ Docker

Docker เหมาะกับใครและกรณีไหนบ้าง

กลุ่มผู้ใช้กรณีที่เหมาะสมตัวอย่างการใช้งาน
นักพัฒนา- ต้องการสภาพแวดล้อมการพัฒนาที่สม่ำเสมอ
- ต้องทำงานร่วมกันในทีม
- ต้องการทดสอบหลายเวอร์ชัน
- พัฒนา Microservices
- ทดสอบกับ database หลายเวอร์ชัน
DevOps- ต้องการ deploy ที่รวดเร็ว
- ต้อง scale บ่อยครั้ง
- ใช้ระบบ CI/CD
- Automated deployment
- Blue-green deployment
ทั่วไป- แอปมี dependencies หลายตัว
- ต้องการพกพาแอปได้
- ต้องการใช้ทรัพยากรอย่างมีประสิทธิภาพ
- รันหลายแอปบนเครื่องเดียว
- แอปที่ต้องการ isolation
กรณีที่ไม่เหมาะสมเหตุผล
ต้องทำงานกับ hardware โดยตรงContainer ไม่ได้เข้าถึง hardware โดยตรง
ต้องการ performance สูงสุดContainer มี overhead บางส่วน
ระบบที่ต้องการความปลอดภัยสูงมากIsolation ไม่เท่ากับ VM

ทำไมต้อง Docker

ด้านใช้ Dockerไม่ใช้ Docker
สภาพแวดล้อมเหมือนกันทุกที่ ผ่าน Docker Imageต่างกันตามเครื่อง แต่ละเครื่องต้องติดตั้ง dependencies เอง
การติดตั้งติดตั้ง Docker ครั้งเดียวติดตั้งทุก dependency สำหรับแต่ละโปรเจค
การ Deployใช้ image เดียว deploy ได้ทุกที่ต้องตั้งค่า environment ใหม่ทุกครั้ง
การ Scaleสร้าง container เพิ่มได้ง่ายต้องตั้งค่า server ใหม่ทั้งหมด
ทรัพยากรใช้ทรัพยากรน้อยกว่า VMใช้ทรัพยากรเต็มที่ แต่ไม่ต้องมี Docker overhead
การพัฒนาใช้ Docker Compose จัดการ servicesต้องรัน services แต่ละตัวด้วยมือ
Dependenciesบรรจุใน image พร้อมใช้ต้องติดตั้งและอัปเดตเอง
ความเข้ากันได้ทำงานได้ทุกที่ที่รัน Dockerขึ้นอยู่กับ OS และ configuration
CI/CDสร้าง image ครั้งเดียว ใช้ได้ทุก stageต้องตั้งค่า environment ในแต่ละ stage ใหม่

Docker Alternatives

Featuredocs.docker.com faviconDocker Docspodman.io faviconPodman Docs
สถาปัตยกรรมใช้ Client-Server (Docker Daemon)ใช้ Rootless (ไม่ต้องมี Daemon)
Securityต้องใช้ rootรันแบบ rootless ได้
Compatibilityรองรับ docker-composeรองรับ podman-compose
OrchestrationDocker SwarmKubernetes
Image Managementใช้ Docker Hubใช้ Docker Hub + Red Hat Registry

Docker Tooling

ToolDescription
www.docker.com faviconDocker Desktopแอปพลิเคชัน GUI สำหรับจัดการ Docker บน Windows/Mac
docs.docker.com faviconDocker CLIอินเตอร์เฟสคำสั่งสำหรับ Docker ที่มีฟีเจอร์ครบถ้วน
github.com faviconLazy DockerTerminal UI สำหรับ Docker ที่ใช้งานง่ายด้วยอินเตอร์เฟสแบบโต้ตอบ
marketplace.visualstudio.com faviconDocker DXเอ็กซ์เทนชั่น VSCode สำหรับจัดการ Docker containers และ images แบบครบวงจร

CLI Command

การจัดการ Container

คำสั่งคำอธิบายตัวอย่าง
docker runรัน container ใหม่docker run -d -p 8080:80 nginx
docker psแสดง container ที่กำลังทำงานdocker ps -a (แสดงทั้งหมด)
docker stopหยุดการทำงานของ containerdocker stop container_id
docker startเริ่มการทำงาน container ที่หยุดอยู่docker start container_id
docker rmลบ containerdocker rm container_id
docker logsดู logs ของ containerdocker logs -f container_id
docker execรันคำสั่งใน containerdocker exec -it container_id sh
docker buildxสร้างและจัดการ multi-platform imagesdocker buildx build --platform linux/amd64,linux/arm64 -t my-image .

การจัดการ Image

คำสั่งคำอธิบายตัวอย่าง
docker buildสร้าง image จาก Dockerfiledocker build -t my-image .
docker imagesแสดงรายการ imagesdocker images
docker pullดึง image จาก registrydocker pull nginx:latest
docker pushอัปโหลด image ไปยัง registrydocker push my-repo/my-image
docker rmiลบ imagedocker rmi image_id

การจัดการ Network

คำสั่งคำอธิบายตัวอย่าง
docker network createสร้าง network ใหม่docker network create my-network
docker network lsแสดงรายการ networksdocker network ls
docker network inspectแสดงรายละเอียด networkdocker network inspect bridge
docker network connectเชื่อมต่อ container เข้ากับ networkdocker network connect my-network container_id
docker network disconnectตัดการเชื่อมต่อ container จาก networkdocker network disconnect my-network container_id

การจัดการ Volume

คำสั่งคำอธิบายตัวอย่าง
docker volume createสร้าง volume ใหม่docker volume create my-volume
docker volume lsแสดงรายการ volumesdocker volume ls
docker volume inspectแสดงรายละเอียด volumedocker volume inspect my-volume
docker volume rmลบ volumedocker volume rm my-volume

Docker Compose

คำสั่งคำอธิบายตัวอย่าง
docker compose upเริ่มการทำงาน servicesdocker compose up -d (โหมดพื้นหลัง)
docker compose downหยุดการทำงาน servicesdocker compose down
docker compose psแสดงรายการ servicesdocker compose ps
docker compose logsดู logs ของ servicesdocker compose logs -f (ติดตาม)
docker compose buildสร้าง image สำหรับ servicesdocker compose build

ข้อมูลระบบ

คำสั่งคำอธิบายตัวอย่าง
docker infoแสดงข้อมูลระบบdocker info
docker versionแสดงเวอร์ชัน Dockerdocker version
docker statsแสดงสถิติการใช้ทรัพยากรdocker stats
docker system pruneลบข้อมูลที่ไม่ได้ใช้docker system prune -a (ลบทั้งหมด)
docker inspectตรวจสอบ objectdocker inspect container_id

Configuration Files

dockerfile
# ใช้ base image ของ Node.js เวอร์ชัน 18 แบบ Alpine (ขนาดเล็ก)
FROM node:18-alpine

# กำหนด working directory ใน container
WORKDIR /app

# คัดลอกไฟล์ package.json และ lock file เท่านั้น (เพื่อใช้ประโยชน์จาก layer caching)
COPY package.json package-lock.json ./

# ติดตั้ง dependencies แบบ production (ไม่ติดตั้ง devDependencies)
RUN npm ci --only=production

# คัดลอกไฟล์โปรเจคทั้งหมด (หลังจากติดตั้ง dependencies เพื่อไม่ให้ invalidate cache)
COPY . .

# Build สำหรับ production
RUN npm run build

# เปิดเผย port 3000 สำหรับการเชื่อมต่อจากภายนอก
EXPOSE 3000

# คำสั่งที่ใช้เริ่มต้นการทำงานของแอปพลิเคชัน
CMD ["npm", "start"]
yaml
# ใช้เวอร์ชัน 3.8 ของ Docker Compose
version: '3.8'

services:
  # Service สำหรับเว็บแอปพลิเคชัน
  web:
    build: .  # สร้าง image จาก Dockerfile ในไดเรกทอรีปัจจุบัน
    ports:
      - "3000:3000"  # Map port 3000 ของ host ไปยัง container
    volumes:
      - .:/app  # Mount โค้ดปัจจุบันเข้าไปใน container (สำหรับ development)
      - /app/node_modules  # แยก node_modules ออกจาก volume
    environment:
      - NODE_ENV=development  # ตั้งค่า environment variable
    depends_on:
      - db  # ระบุว่าต้องเริ่ม db ก่อน

  # Service สำหรับฐานข้อมูล PostgreSQL
  db:
    image: postgres:13  # ใช้ official PostgreSQL image
    environment:
      - POSTGRES_PASSWORD=postgres  # ตั้งค่ารหัสผ่าน
    volumes:
      - postgres_data:/var/lib/postgresql/data  # Persistent storage สำหรับข้อมูล

# กำหนด volumes ที่จะใช้
volumes:
  postgres_data:  # Volume สำหรับเก็บข้อมูล PostgreSQL
dockerfile
# ไฟล์และโฟลเดอร์ที่ควรละเว้นในการ build Docker image

# Dependencies
node_modules  # ไม่จำเป็นเพราะจะติดตั้งใหม่ใน container

# Log files
npm-debug.log  # Log files จาก development

# IDE และระบบปฏิบัติการ
.DS_Store  # macOS metadata
.idea  # JetBrains IDE configuration

# Environment variables
.env  # ไฟล์ environment (ควรใช้ docker secrets หรือ environment variables แทน)

# Version control
.git  # ไม่จำเป็นใน image
.gitignore  # ไม่จำเป็นใน image

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

1. สร้างเว็บเซิร์ฟเวอร์ด้วย Nginx

dockerfile
# Dockerfile
FROM node:18
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
bash
# คำสั่งใช้งาน
$ docker build -t myapp .
$ docker run -p 3000:3000 myapp

2. Docker Compose

yaml
# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
  db:
    image: postgres:13
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:
bash
# คำสั่งใช้งาน
$ docker-compose up -d

3. ระบบฐานข้อมูล MySQL พร้อมข้อมูลเริ่มต้น

yaml
# docker-compose.yml
version: '3.8'
services:
  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=pass
      - MYSQL_DATABASE=mydb
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
bash
# คำสั่งใช้งาน
$ docker-compose up -d

4. Build แอป React สำหรับ production

dockerfile
# Dockerfile
FROM node:18 as builder
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
bash
# คำสั่งใช้งาน
$ docker build -t myapp .
$ docker run -p 80:80 myapp

Last updated: