Docker
Docker คือ แพลตฟอร์มสำหรับสร้าง รัน และจัดการแอปพลิเคชันในรูปแบบของ Container Container จะรวมทุกอย่างที่แอปต้องใช้ไว้ในกล่องเดียว เช่น Code, Library, System dependencies จึงทำให้แอปรันได้เหมือนกันทุกที่ บนเครื่อง, Server, Cloud เป็นต้น
Container เป็น”กล่อง” ที่ห่อหุ้มแอปไว้ ไม่ต้องติดตั้งโปรแกรมในระบบหลัก (host) ไม่เหมือน VM ที่รัน OS ทั้งตัว –> Container ใช้ resource น้อยกว่า Docker
- Image = ต้นแบบของ Container (เหมือนแม่พิมพ์)
- Container = สิ่งที่รันจริงจาก image
- Dockerfile = ไฟล์กำหนดขั้นตอนการสร้าง image
- Registry = ที่เก็บ image เช่น Docker Hub
ด้านที่เปรียบเทียบ | ติดตั้งเอง (Native) | เครื่องเสมือน (VM) | Docker (Container) |
---|---|---|---|
1. การใช้งานทรัพยากร (Resource Usage) | มาก (เต็ม OS ทุกอย่าง) | มาก (VM ต้องมี OS เต็มตัว) | น้อยมาก (ใช้ Kernel ร่วมกัน) |
2. ความเร็วในการเริ่มต้น (Startup Time) | ช้า | ปานกลางถึงช้า (บูต OS) | เร็วมาก (หลักวินาที) |
3. ความยืดหยุ่นในการย้าย (Portability) | ต่ำ | ปานกลาง (ย้าย VM ได้) | สูง (image ย้ายข้ามเครื่องได้ง่ายมาก) |
4. การแยกสภาพแวดล้อม (Isolation) | แทบไม่มี | สูง (มี OS แยกแต่ละ VM) | สูง (แต่ใช้ kernel ร่วมกัน) |
5. ความง่ายในการติดตั้ง/ลบ | ยาก (manual, เสี่ยงพังระบบ) | ปานกลาง (ใช้ snapshot ได้) | ง่ายมาก (แค่ docker run , down ) |
6. ความสอดคล้องใน dev → prod | ต่ำ (ขึ้นกับเครื่อง) | ปานกลาง (แต่ VM ใหญ่) | สูง (Dev = Prod ถ้าใช้ image เดียวกัน) |
7. การแชร์ระหว่างทีม | ยาก | ปานกลาง | ง่าย (แค่แชร์ Dockerfile หรือ image) |
8. ขนาดไฟล์โดยรวม | เล็ก (เฉพาะโปรแกรม) | ใหญ่มาก (รวม OS เต็ม ๆ) | เล็กกว่า VM มาก (ไม่รวม OS) |
9. การจัดการด้วยโค้ด (IaC) | ไม่ได้ (manual) | บางส่วน (VM template) | ได้เต็มที่ (Dockerfile, Compose) |
10. การใช้ร่วมกับ DevOps / CI/CD | ยาก | ปานกลาง | ดีเยี่ยม (เหมาะกับ workflow CI/CD) |
11. ความง่ายในการ scale / ขนาน | ยากมาก | ยาก | ง่ายมาก (สร้าง container ใหม่ได้ทันที) |
12. การทำ snapshot/rollback | ไม่มี | มี snapshot เต็มระบบ | ใช้ image/version tag rollback ได้ |
13. ความเข้าใจที่ต้องมี | ต่ำ (พื้นฐานทั่วไป) | ปานกลาง (ต้องเข้าใจ VM) | สูงขึ้น (ต้องเข้าใจ containerization) |
14. GUI / Desktop ใช้งานได้ไหม | ได้เต็มที่ | ได้เต็มที่ | ไม่เหมาะ (Container เหมาะกับ CLI/app) |
15. ใช้ใน Production จริง | ได้แต่ไม่แนะนำ | บางกรณี (เช่น legacy system) | ได้ดีมาก (ใช้กันทั่วโลก: Netflix, Google, etc.) |
สรุป
- ติดตั้งเอง (Native Install) เหมาะกับ ทดลองระยะสั้น, คนเริ่มต้น เสี่ยงพังระบบ, ทำซ้ำได้ยาก, แชร์ลำบาก
- Virtual Machine (VM) เหมาะกับ ระบบที่ต้องการแยก OS, Windows ใน macOS, legacy software หนักเครื่อง, ใช้ resource เยอะ, ช้ากว่า
- Docker / Container เหมาะกับ Data Science, DevOps, Dev Team, CI/CD, Cloud, Microservices เบา, เร็ว, ย้ายง่าย, ทำซ้ำได้, จัดการง่าย
คำสั่ง Docker ที่สำคัญใช้งานบ่อย
คำสั่งพื้นฐานทั่วไป
คำสั่ง | คำอธิบาย |
---|---|
docker --version | ดูเวอร์ชันของ Docker ที่ติดตั้ง |
docker info | แสดงรายละเอียดระบบ Docker |
จัดการ Image
คำสั่ง | คำอธิบาย |
---|---|
docker pull [image_name] | ดาวน์โหลด image จาก Docker Hub เช่น docker pull nginx |
docker images | แสดงรายการ images ที่มีอยู่ในเครื่อง |
docker rmi <image_id> | ลบ image ออกจากเครื่อง |
จัดการ Container
คำสั่ง | คำอธิบาย |
---|---|
docker run [options] [image_name] | รัน container เช่น docker run hello-world |
docker run -d --name my-nginx -p 8080:80 nginx | รัน Container Nginx ในพื้นหลัง พร้อมตั้งค่าต่าง ๆ สำหรับใช้งานเว็บเซิร์ฟเวอร์ |
docker run -d --name my-php -p 9000:80 -v ~/Desktop/docker-webserver/app:/var/www/html php:8.2-apache | รัน Container ที่มี PHP + Apache (เวอร์ชัน 8.2) สำหรับพัฒนาเว็บ โดยมีการ mount โฟลเดอร์โค้ดจากเครื่องเราเข้าไปใน container |
docker run -it ubuntu bash | เข้า interactive shell ภายใน container |
docker ps | ดู container ที่กำลังทำงานอยู่ |
docker ps -a | ดู container ทั้งหมด (รวมที่หยุดไปแล้ว) |
docker stop <container_id> | หยุด container |
docker rm <container_id> | ลบ container |
จัดการ Volume & Mount
คำสั่ง | คำอธิบาย |
---|---|
docker volume ls | แสดง volume ทั้งหมด |
docker run -v $(pwd):/app nginx | mount ไดเรกทอรีปัจจุบันเข้า container |
docker volume prune | ลบ volume ที่ไม่ได้ใช้งานแล้วทั้งหมด |
Dockerfile และ Build
คำสั่ง | คำอธิบาย |
---|---|
docker build -t myapp . | สร้าง image จาก Dockerfile |
docker tag myapp myuser/myapp:1.0 | ตั้งชื่อ/tag ใหม่ให้ image |
docker push myuser/myapp:1.0 | ส่ง image ขึ้น Docker Hub |
Docker Network
คำสั่ง | คำอธิบาย |
---|---|
docker network ls | แสดงรายการเครือข่ายที่มีอยู่ทั้งหมด |
docker network create [OPTIONS] NAME | สร้างเครือข่ายใหม่ |
docker network inspect NETWORK_NAME | ดูรายละเอียดของเครือข่าย เช่น container ที่เชื่อมต่อ, IP |
docker network rm NETWORK_NAME | ลบเครือข่าย (ต้องไม่มี container เชื่อมต่ออยู่) |
docker network connect NETWORK_NAME CONTAINER | เชื่อม container เข้ากับเครือข่ายที่กำหนด |
docker network disconnect NETWORK_NAME CONTAINER | ตัดการเชื่อมต่อ container ออกจากเครือข่าย |
Docker Compose
คำสั่ง | คำอธิบาย |
---|---|
docker compose up | สร้างและรัน container ตามไฟล์ docker-compose.yml |
docker compose up -d | ทำงานแบบ background |
docker compose down | หยุดและลบ container, network, volume ที่เกี่ยวข้อง |
docker compose ps | แสดงสถานะ container ที่รันผ่าน compose |
เพิ่มเติมสำหรับการพัฒนา
คำสั่ง | คำอธิบาย |
---|---|
docker exec -it <container_id> bash | เข้าไปยัง container ที่รันอยู่ |
docker logs <container_id> | ดู log ของ container |
docker stats | ดูสถานะการใช้ทรัพยากรของ container แบบ real-time |
docker run [options] [image_name]
คำสั่ง docker run
ใช้สำหรับสร้างและรัน container จาก image ที่ระบุ โดยสามารถใส่ options
เพิ่มเติมเพื่อกำหนดพฤติกรรมต่าง ๆ ได้
docker run [OPTIONS] [IMAGE_NAME] [COMMAND] [ARG…]
OPTIONS
: ตัวเลือกหรือพารามิเตอร์เสริมIMAGE_NAME
: ชื่อ image เช่น nginx
, mysql:8.0
COMMAND
: คำสั่งที่จะรันใน container (optional)ARG...
: อาร์กิวเมนต์ของคำสั่ง (optional)
[OPTIONS]
Option | ความหมาย |
---|---|
-d | Detached mode (background) |
-it | Interactive + terminal |
--name | ตั้งชื่อ container |
--rm | ลบ container ทันทีเมื่อหยุดทำงาน |
-p | กำหนดพอร์ต (host:container) |
-v | Mount volume หรือ bind mount |
-e | กำหนด environment variable |
--network | เชื่อม container เข้ากับ network |
--restart | restart เช่น always , on-failure |
ตัวอย่าง
1. รัน container แบบชั่วคราว (interactive)-it
: โหมด interactive + terminalubuntu
: image ที่ใช้/bin/bash
: คำสั่งที่จะรันใน container
docker run -it ubuntu /bin/bash
2. รันแบบ background (detached)-d
: รันแบบ detached (background)--name
: ตั้งชื่อ container-p
: map พอร์ต (host:container)
docker run -d --name my-nginx -p 8080:80 nginx
3. กำหนด environment variables-e
: กำหนดค่าตัวแปรแวดล้อม
docker run -e MYSQL_ROOT_PASSWORD=rootpass mysql
4. Mount volume เข้ากับ container-v
: กำหนด volume สำหรับแชร์ไฟล์ระหว่าง host กับ container
docker run -v /host/path:/container/path nginx
5. เชื่อมต่อ container กับ network ที่กำหนด
docker run --network=mynet --name myapp myimage
docker network
คำสั่ง docker network
ใช้ในการ จัดการเครือข่าย (network) ระหว่าง container เพื่อให้ container หลายตัวสามารถสื่อสารกันได้ในระดับที่ควบคุมได้ เช่น ใช้ network ร่วมกัน, แยก subnet, หรือเชื่อม container กับ host network เป็นต้น
คำสั่ง | คำอธิบาย |
---|---|
docker network ls | แสดงรายการเครือข่ายทั้งหมดที่มี |
docker network create [OPTIONS] NETWORK_NAME | สร้าง network ใหม่ |
docker network inspect NETWORK_NAME | แสดงรายละเอียดของ network ที่ระบุ |
docker network rm NETWORK_NAME | ลบ network ที่ไม่ถูกใช้งาน |
docker network connect NETWORK_NAME CONTAINER | เชื่อม container กับ network ที่กำหนด |
docker network disconnect NETWORK_NAME CONTAINER | ตัดการเชื่อมต่อ container ออกจาก network |
ประเภทของ Docker Network Drivers
Driver | ความหมาย |
---|---|
bridge | เครือข่ายภายในเครื่อง (default สำหรับ container เดี่ยว) |
host | ให้ container ใช้ network เดียวกับ host |
none | ไม่มีการเชื่อมต่อ network (ใช้กับ container isolated) |
overlay | สำหรับ Docker Swarm (เชื่อม container หลาย host) |
macvlan | ให้ container มี IP address ของตัวเองในเครือข่ายจริง |
ตัวอย่าง
1. สร้าง network ใหม่
คำสั่งนี้สร้าง network ใหม่ชื่อว่า mynet
ใช้ driver แบบ bridge
(เหมาะสำหรับ container ภายในเครื่องเดียวกัน)
docker network create --driver bridge mynet
docker network create
เป็นคำสั่งสร้าง network ใหม่mynet
เป็นชื่อของ network ที่ต้องการสร้าง
docker network create mynet
2. เชื่อม container เข้ากับ network ที่กำหนด
เชื่อม container ชื่อ my-phpmyadmin
เข้ากับ network ชื่อ mynet
หลังเชื่อมสำเร็จ my-phpmyadmin
สามารถ ping หรือเชื่อมกับ container อื่นที่อยู่ใน mynet
ได้ทันที
docker network connect mynet my-phpmyadmin
เชื่อม container ชื่อ my-mysql
เข้ากับ network ชื่อ mynet
หลังเชื่อมสำเร็จ my-
สามารถ ping หรือเชื่อมกับ container อื่นที่อยู่ใน mysql
mynet
ได้ทันที
docker network connect mynet my-mysql