Dark mode
Docker คืออะไร
Docker เป็นแพลตฟอร์มสำหรับพัฒนา แพ็คเกจ และรันแอปพลิเคชันในสภาพแวดล้อมที่แยกออกจากกันเรียกว่า container โดยมีลักษณะสำคัญดังนี้:
เปรียบเทียบ | Docker Container | Virtual Machine |
---|---|---|
สถาปัตยกรรม | ใช้ Docker Engine บน Host OS | ใช้ Hypervisor จำลองฮาร์ดแวร์ |
ระบบปฏิบัติการ | แชร์ kernel ของ Host OS | มี Guest OS เต็มรูปแบบ |
ทรัพยากรระบบ | ใช้ทรัพยากรน้อย | ใช้ทรัพยากรมาก |
เวลาเริ่มต้น | วินาที | นาที |
ประสิทธิภาพ | ใกล้เคียง Native | มี Overhead |
ขนาด | MB | GB |
ข้อดีหลัก | - ประสิทธิภาพสูง - ใช้ทรัพยากรน้อย - พกพาง่าย - รวดเร็ว | - ความปลอดภัยสูง - รัน 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
Feature | ||
---|---|---|
สถาปัตยกรรม | ใช้ Client-Server (Docker Daemon) | ใช้ Rootless (ไม่ต้องมี Daemon) |
Security | ต้องใช้ root | รันแบบ rootless ได้ |
Compatibility | รองรับ docker-compose | รองรับ podman-compose |
Orchestration | Docker Swarm | Kubernetes |
Image Management | ใช้ Docker Hub | ใช้ Docker Hub + Red Hat Registry |
Docker Tooling
Tool | Description |
---|---|
แอปพลิเคชัน GUI สำหรับจัดการ Docker บน Windows/Mac | |
อินเตอร์เฟสคำสั่งสำหรับ Docker ที่มีฟีเจอร์ครบถ้วน | |
Terminal UI สำหรับ Docker ที่ใช้งานง่ายด้วยอินเตอร์เฟสแบบโต้ตอบ | |
เอ็กซ์เทนชั่น 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 | หยุดการทำงานของ container | docker stop container_id |
docker start | เริ่มการทำงาน container ที่หยุดอยู่ | docker start container_id |
docker rm | ลบ container | docker rm container_id |
docker logs | ดู logs ของ container | docker logs -f container_id |
docker exec | รันคำสั่งใน container | docker exec -it container_id sh |
docker buildx | สร้างและจัดการ multi-platform images | docker buildx build --platform linux/amd64,linux/arm64 -t my-image . |
การจัดการ Image
คำสั่ง | คำอธิบาย | ตัวอย่าง |
---|---|---|
docker build | สร้าง image จาก Dockerfile | docker build -t my-image . |
docker images | แสดงรายการ images | docker images |
docker pull | ดึง image จาก registry | docker pull nginx:latest |
docker push | อัปโหลด image ไปยัง registry | docker push my-repo/my-image |
docker rmi | ลบ image | docker rmi image_id |
การจัดการ Network
คำสั่ง | คำอธิบาย | ตัวอย่าง |
---|---|---|
docker network create | สร้าง network ใหม่ | docker network create my-network |
docker network ls | แสดงรายการ networks | docker network ls |
docker network inspect | แสดงรายละเอียด network | docker network inspect bridge |
docker network connect | เชื่อมต่อ container เข้ากับ network | docker network connect my-network container_id |
docker network disconnect | ตัดการเชื่อมต่อ container จาก network | docker network disconnect my-network container_id |
การจัดการ Volume
คำสั่ง | คำอธิบาย | ตัวอย่าง |
---|---|---|
docker volume create | สร้าง volume ใหม่ | docker volume create my-volume |
docker volume ls | แสดงรายการ volumes | docker volume ls |
docker volume inspect | แสดงรายละเอียด volume | docker volume inspect my-volume |
docker volume rm | ลบ volume | docker volume rm my-volume |
Docker Compose
คำสั่ง | คำอธิบาย | ตัวอย่าง |
---|---|---|
docker compose up | เริ่มการทำงาน services | docker compose up -d (โหมดพื้นหลัง) |
docker compose down | หยุดการทำงาน services | docker compose down |
docker compose ps | แสดงรายการ services | docker compose ps |
docker compose logs | ดู logs ของ services | docker compose logs -f (ติดตาม) |
docker compose build | สร้าง image สำหรับ services | docker compose build |
ข้อมูลระบบ
คำสั่ง | คำอธิบาย | ตัวอย่าง |
---|---|---|
docker info | แสดงข้อมูลระบบ | docker info |
docker version | แสดงเวอร์ชัน Docker | docker version |
docker stats | แสดงสถิติการใช้ทรัพยากร | docker stats |
docker system prune | ลบข้อมูลที่ไม่ได้ใช้ | docker system prune -a (ลบทั้งหมด) |
docker inspect | ตรวจสอบ object | docker 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