Dark mode
What is 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: กำหนดมาตรฐานการแพ็คเกจและรันแอปพลิเคชัน
Why 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 | ไฟล์กำหนดค่าสำหรับสร้าง Docker image ประกอบด้วยคำสั่งต่างๆ เช่น FROM, COPY, RUN |
docker-compose.yml | ไฟล์กำหนดค่าสำหรับจัดการหลาย containers พร้อมกัน ระบุ services, networks, volumes |
.dockerignore | ไฟล์กำหนดไฟล์และโฟลเดอร์ที่ควรละเว้นในการ build Docker image |
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
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
sh
# ไฟล์และโฟลเดอร์ที่ควรละเว้นในการ 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
Examples
Create a Web Server with 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
MySQL Database with Initial Data
yaml
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
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