17 ธ.ค. เวลา 06:19 • การศึกษา

Docker Images คืออะไร

โดย
ในยุคที่แอปพลิเคชันต้องทำงานได้บนทุกสภาพแวดล้อมโดยไม่เกิดปัญหา "รันได้บนเครื่องฉันแต่รันบนเครื่องเธอไม่ได้" Docker Images ปรากฏขึ้นเป็นพระเอกที่เปลี่ยนโฉมการพัฒนา และ การส่งมอบซอฟต์แวร์โดยสิ้นเชิง หาก Container คือบ้านที่เราสามารถเข้าอยู่ได้ทันที Docker Images ก็คือแบบแปลนบ้านพร้อมชิ้นส่วนทั้งหมดที่ประกอบกันได้อย่างสมบูรณ์แบบ
2
  • ​Docker Images คืออะไร
Docker Images คือ เทมเพลตหรือบลูพรินท์แบบอ่านได้อย่างเดียว (Read-only Template) ที่ประกอบด้วยชุดคำสั่ง และ ข้อมูลทั้งหมดที่จำเป็นสำหรับสร้าง Docker Container ขึ้นมาทำงานได้
💡 ลองจินตนาการว่า
- Docker Image = ซองบิสกิตสำเร็จรูป (มีส่วนผสมและสูตรครบถ้วน)
- Docker Container = บิสกิตที่อบเสร็จแล้ว และ พร้อมรับประทาน
2
หรือเปรียบเทียบได้กับ:
- Image = Class ในภาษาโปรแกรมมิ่ง (เป็นต้นแบบ)
- Container = Object (เป็นอินสแตนซ์ที่รันได้จริง)
  • ​องค์ประกอบสำคัญของ Docker Images
1) Base Image
- ระบบปฏิบัติการพื้นฐาน (เช่น Ubuntu, Alpine Linux)
2) Dependencies
- ไลบรารี และ แพ็คเกจที่แอปพลิเคชันต้องการ
3) Source Code
- โค้ดแอปพลิเคชัน
4) Configuration Files
- ไฟล์กำหนดค่าต่างๆ
5) Metadata
- ข้อมูลเพิ่มเติมเกี่ยวกับ Image
1
  • ​Docker Images ทำงานอย่างไร
1) ระบบ Layer-Based Architecture
Docker Images ใช้ระบบชั้นข้อมูล (Layers) ที่ชาญฉลาด
☆ โครงสร้างแบบ Layer
■ Read-Write Container
| ← Container Layer (ไม่ใช่ส่วนของ Image)
■ App Layer (Layer 4)
| ← เปลี่ยนแปลงโค้ดแอป
■ Dependency Layer
(Layer 3) | ← ติดตั้งไลบรารีเพิ่ม
■ System Layer (Layer 2)
| ← อัปเดตแพ็คเกจระบบ
■ Base Image (Layer 1)
| ← ระบบปฏิบัติการพื้นฐาน
☆ หลักการทำงานของ Layers
- Immutable Layers
แต่ละ Layer เป็นแบบอ่านได้อย่างเดียว และ ไม่เปลี่ยนแปลง
- Union File System
รวม Layers ทั้งหมดให้เห็นเป็นระบบไฟล์เดียว
- Copy-on-Write
เมื่อ Container ต้องการแก้ไขไฟล์ใน Layer ที่อ่านได้อย่างเดียว จะสร้างสำเนาใน Container Layer แทน
- Layer Sharing
Layer เดียวกันสามารถแชร์ระหว่าง Images หลายตัวได้
2) กระบวนการสร้าง Image (Build Process)
Dockerfile → [Build Context] → [Docker Daemon] → Docker Image
☆ ตัวอย่างขั้นตอนจาก Dockerfile
FROM ubuntu:20.04
← สร้าง Layer 1: ดึง Base Image
RUN apt-get update
← สร้าง Layer 2: อัปเดตแพ็คเกจ
RUN apt-get install -y nginx ← สร้าง Layer 3: ติดตั้ง nginx
COPY
index.html /var/www/html ← สร้าง Layer 4: คัดลอกไฟล์
EXPOSE 80
← Metadata
CMD ["nginx", "-g", "daemon off;"] ← Metadata
1
3) Content Addressable Storage
Docker Images ใช้ Content Addressable Storage (CAS) โดยแต่ละ Layer มี
- Content Hash (Digest):
แฮชที่คำนวณจากเนื้อหา Layer
ตัวอย่าง sha256:abc123def456...
✅️ ประโยชน์: ตรวจสอบความสมบูรณ์ของข้อมูลและแชร์ Layer ระหว่าง Images
  • ​ประเภทของ Docker Images
1) แบ่งตามแหล่งที่มา
☆ Official Images
- Images ที่ดูแลโดย Docker หรือผู้พัฒนาซอฟต์แวร์ต้นฉบับ
- ตัวอย่าง: nginx:latest , node:16 , postgres:13
- คุณสมบัติ
○ Security updates สม่ำเสมอ
○ Best practices ในการสร้าง Image
○ Documentation ที่ครบถ้วน
☆ Verified Publisher Images
- จากบริษัทที่น่าเชื่อถือ
- ผ่านการตรวจสอบจาก Docker
- ตัวอย่าง: mongo:5.0 จาก MongoDB Inc.
☆ Community Images
- จากผู้ใช้ Docker ทั่วไป
- ใช้คำสั่ง docker search เพื่อค้นหา
- ควรระวัง: ตรวจสอบความน่าเชื่อถือก่อนใช้งาน
☆ Private/Custom Images
- Images ที่สร้างเองสำหรับองค์กร
- เก็บใน Private Registry
2) แบ่งตามลักษณะการใช้งาน
☆ Base Images
- Images พื้นฐานที่มีเฉพาะระบบปฏิบัติการ
- ตัวอย่าง: ubuntu , alpine, centos
- Alpine Linux: ได้รับความนิยมเนื่องจากขนาดเล็ก (เพียง 5MB)
☆ Runtime Images
- มี runtime environment พร้อมใช้งาน
- ตัวอย่าง: openjdk:11 , python:3.9 , node:16-alpine
☆ Application Images
- มีแอปพลิเคชันติดตั้งพร้อมรัน
- ตัวอย่าง: wordpress:php8.0 ,
jenkins/jenkins:lts
☆ Multi-stage Build Images
- ใช้หลาย Stage ในการ Build
- ลดขนาด Image สุดท้าย
- แยก Build environment กับ Runtime environment
3) แบ่งตาม Tag/Version
☆ Latest Tag
- image:latest - เวอร์ชันล่าสุด
- ข้อควรระวัง: อาจไม่เสถียรที่สุด
1
☆ Version-specific Tags
- node:16.13.1 เวอร์ชันเฉพาะ
- ubuntu:20.04 รุ่นเฉพาะของ OS
☆ Variant Tags
- node:16-alpine รุ่นที่ใช้ Alpine Linux
- python:3.9-slim รุ่นขนาดเล็ก
  • ​ประโยชน์
1) ความสอดคล้องของสภาพแวดล้อม (Environment Consistency)
- แอปพลิเคชันทำงานเหมือนกันทุกที่
- ลดปัญหา "Works on my machine"
- จาก Development → Testing → Production
2
2) พกพาได้และไม่ขึ้นกับแพลตฟอร์ม (Portability)
- รันบน Linux, Windows, macOS
- รันบน Cloud ทุก Provider
- รันบน On-premise Servers
3) ประสิทธิภาพการใช้งานทรัพยากร
- ขนาดเล็ก: แชร์ Layers ระหว่าง Images
- สร้างเร็ว: ใช้ Layer Caching
- ใช้ทรัพยากรน้อย: เทียบกับ Virtual Machines
4) ความปลอดภัยโดยการออกแบบ
- Immutable: Images ไม่เปลี่ยนแปลง
- Minimal: ใช้ Base Images ขนาดเล็กลด Attack Surface
- Reproducible: สร้างได้เหมือนเดิมทุกครั้ง
1
5) การจัดการเวอร์ชันที่ง่ายดาย
- Tag ระบุเวอร์ชันชัดเจน
- Rollback ได้ง่ายโดยใช้ Tag เก่า
- จัดการหลายเวอร์ชันพร้อมกัน
6) Accelerated Development Workflow
- Developer ใช้เวลา Setup น้อยลง
- เริ่มทำงานได้ภายในนาที
- ทดสอบหลาย Environment ง่าย
  • ​คำสั่ง Docker Images ที่สำคัญ
1) คำสั่งจัดการ Images พื้นฐาน
☆ docker pull
```
docker pull nginx:latest
```
- ดึง Image จาก Registry
- อ็อปชันเพิ่มเติม:
```
docker pull --platform linux/amd64 nginx:latest
```
☆ docker images หรือ docker image ls
```
docker images
docker image ls
```
- แสดงรายการ Images ในเครื่อง
- อ็อปชันที่ใช้บ่อย:
```
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
docker images --filter "dangling=true"
```
☆ docker rmi หรือ docker image rm
```
docker rmi nginx:latest
docker rmi (docker images -q) # ลบทั้งหมด
```
- ลบ Images ออกจากเครื่อง
- คำเตือน: ต้องหยุด และ ลบ Containers ที่ใช้ Image ก่อน
2) คำสั่งสร้างและจัดการ Images
☆ docker build
```
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.dev .
```
- สร้าง Image จาก Dockerfile
- อ็อปชันสำคัญ:
```
--no-cache # ไม่ใช้ cache
--build-arg # ส่ง build arguments
--target # Build เฉพาะ stage ใน multi-stage build
```
☆ docker tag
```
docker tag myapp:1.0 myregistry.com/myapp:latest
```
- สร้าง Tag ใหม่ให้กับ Image
- คัดลอก Image พร้อมชื่อใหม่
☆ docker save และ docker load
```
docker save myapp:1.0 > myapp.tar
docker load < myapp.tar
```
- Export/Import Images เป็นไฟล์ tar
- ใช้สำหรับ Backup หรือ Transfer
☆ docker export และ docker import
```
docker export container_name > container.tar
docker import container.tar new_image:tag
```
- Export Container เป็น Image
- ข้อแตกต่างจาก save/load ไม่รวม Metadata และ Layer structure
3) คำสั่งตรวจสอบและวิเคราะห์ Images
☆ docker history
```
docker history nginx:latest
```
- แสดงประวัติ Layer ของ Image
- เห็นคำสั่งที่ใช้สร้างแต่ละ Layer
☆ docker inspect
```
docker inspect nginx:latest
docker inspect --format='{{.Config.Cmd}}' nginx:latest
```
- แสดงข้อมูลรายละเอียดของ Image
- ดู Configuration, Layers, Metadata
☆ docker image prune
```
docker image prune
docker image prune -a # ลบทั้งหมดที่ไม่มี container ใช้
```
- ลบ Images ที่ไม่ได้ใช้งาน
- Clean up disk space
4) คำสั่งสำหรับ Registry
☆ docker push
```
```
- อัปโหลด Image ไปยัง Registry
☆ docker search
```
docker search nginx
docker search --filter stars=100 nginx
```
- ค้นหา Images ใน Docker Hub
5) คำสั่งทำงานกับหลาย Images
☆ การลบ Images หลายตัว
```
# ลบโดยใช้ filter
docker rmi $(docker images -q -f dangling=true)
# ลบทั้งหมด
docker rmi $(docker images -q)
```
☆ การติด Tag หลายตัว
```
docker tag myapp:1.0 registry1.com/myapp:1.0
docker tag myapp:1.0 registry2.com/myapp:latest
```
6) คำสั่งพิเศษและอ็อปชัน
☆ Multi-platform Build
```
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:multi .
```
- สร้าง Images สำหรับหลายแพลตฟอร์ม
☆ ตรวจสอบ Disk Usage
```
docker system df
```
- แสดงการใช้ Disk space ของ Docker
☆ Build Context Optimization
```
# สร้าง .dockerignore file
node_modules
.git
*.log
```
✏️ Shoper Gamer
  • ​Docker คืออะไร? เปลี่ยนการพัฒนาแอปพลิเคชันให้ง่ายเหมือนแพ็คกระเป๋า! 👇
Credit :
👇
  • ​https://www.blockdit.com/posts/5e18f045521c192f8e6a65d4
  • ​https://www.blockdit.com/posts/60efbbbbbefeff0d2245bd5b
  • ​https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-an-image/
โฆษณา