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 nginxmount ไดเรกทอรีปัจจุบันเข้า 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ความหมาย
-dDetached mode (background)
-itInteractive + terminal
--nameตั้งชื่อ container
--rmลบ container ทันทีเมื่อหยุดทำงาน
-pกำหนดพอร์ต (host:container)
-vMount volume หรือ bind mount
-eกำหนด environment variable
--networkเชื่อม container เข้ากับ network
--restartrestart เช่น always, on-failure

ตัวอย่าง

1. รัน container แบบชั่วคราว (interactive)
-it: โหมด interactive + terminal
ubuntu: 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-mysql สามารถ ping หรือเชื่อมกับ container อื่นที่อยู่ใน mynet ได้ทันที

docker network connect mynet my-mysql