วงจรชีวิตของ Container
การรัน container
หัวข้อที่มีชื่อว่า “การรัน container”docker run เป็นคำสั่งที่ใช้บ่อยที่สุด จะ pull image ถ้าจำเป็น, สร้าง container, และเริ่มการทำงาน
docker run nginx:alpineคำสั่งนี้รัน nginx ใน foreground — terminal ของคุณจะ attach กับ output ของตัวเอง กด Ctrl+C เพื่อหยุด
โหมด detached ด้วย -d
หัวข้อที่มีชื่อว่า “โหมด detached ด้วย -d”เพิ่ม -d เพื่อรัน container ในเบื้องหลัง:
docker run -d nginx:alpineDocker จะแสดง container ID เต็มและคืน prompt ทันที
การตั้งชื่อ container ด้วย --name
หัวข้อที่มีชื่อว่า “การตั้งชื่อ container ด้วย --name”Docker จะกำหนดชื่อแบบสุ่มโดยค่าเริ่มต้น ใช้ --name เพื่อตั้งชื่อที่คาดเดาได้:
docker run -d --name webserver nginx:alpineการแสดงรายการ container
หัวข้อที่มีชื่อว่า “การแสดงรายการ container”# เฉพาะ container ที่กำลังทำงานdocker ps
# container ทั้งหมด — ทั้งที่กำลังทำงานและหยุดแล้วdocker ps -aCONTAINER ID IMAGE STATUS NAMESa1b2c3d4e5f6 nginx:alpine Up 2 minutes webserverb7c8d9e0f1a2 alpine Exited (0) 5 minutes ago old-taskคอลัมน์ STATUS บอกว่า container กำลังทำงาน (Up) หรือหยุดแล้ว (Exited)
การหยุด, เริ่ม, และรีสตาร์ท
หัวข้อที่มีชื่อว่า “การหยุด, เริ่ม, และรีสตาร์ท”# หยุดอย่างสุภาพ — ส่ง SIGTERM, รอ 10 วินาที, แล้วจึง SIGKILLdocker stop webserver
# เริ่ม container ที่หยุดอยู่docker start webserver
# รีสตาร์ท (หยุดแล้วเริ่มใหม่)docker restart webserverdocker stop ไม่ได้ ลบ container ออก ตัว container ยังคงอยู่บนดิสก์ในสถานะหยุด
การลบ container
หัวข้อที่มีชื่อว่า “การลบ container”# ลบ container ที่หยุดอยู่docker rm webserver
# บังคับลบ container ที่กำลังทำงาน (ส่ง SIGKILL)docker rm -f webserverคุณไม่สามารถลบ container ที่กำลังทำงานได้โดยไม่ใช้ -f
การทำความสะอาดอัตโนมัติด้วย --rm
หัวข้อที่มีชื่อว่า “การทำความสะอาดอัตโนมัติด้วย --rm”สำหรับงานที่ทำครั้งเดียวและไม่ต้องการจัดการด้วยตนเอง ให้เพิ่ม --rm Container จะถูกลบอัตโนมัติทันทีที่ process สิ้นสุด
docker run --rm alpine echo "Hello, Docker!"Hello, Docker!Container หายไปทันทีที่ echo เสร็จสิ้น — ไม่ต้องรัน docker rm เพิ่ม
# 1. Run nginx detached with a name
docker run -d --name webserver nginx:alpine
# 2. List running containers
docker ps
# 3. Stop it
docker stop webserver
# 4. Show all containers — notice STATUS is Exited
docker ps -a
# 5. Start it again
docker start webserver
# 6. Remove it (stop first)
docker stop webserver && docker rm webserver
# 7. One-shot: auto-cleanup with --rm
docker run --rm alpine echo "done — already gone"ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
รันแบบ foreground (ไม่ใส่ -d) | เห็น log แบบ real-time ทันทีที่รัน กด Ctrl+C หยุดได้ง่าย | terminal ถูก block ใช้งานอย่างอื่นไม่ได้จนกว่าจะหยุด |
รันแบบ detached (-d) | terminal ว่างใช้งานต่อได้ รันหลาย container พร้อมกันสะดวก | ต้องเปิด docker logs เองถึงจะเห็น output และลืมง่ายว่ามี container ทำงานอยู่เบื้องหลัง |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- รัน container โดยลืมใส่
-dแล้ว terminal ถูก block โดยไม่ตั้งใจ ต้องเปิด terminal ใหม่มาทำงานต่อ docker stopแล้วเข้าใจผิดว่า container หายไปแล้ว ทั้งที่จริงยังอยู่บนดิสก์ในสถานะหยุด ลืมdocker rmตามไปเรื่อยๆ จนสะสมdocker restartพร่ำเพรื่อทันทีที่เจอปัญหา โดยไม่เช็คdocker logsก่อนว่า container crash เพราะอะไร ทำให้วนแก้ปัญหาเดิมซ้ำ
💡 ตัวอย่างจากของจริง
แนวคิด
restartPolicyของ Kubernetes Pod (Always,OnFailure,Never) คือ idea เดียวกับdocker restartที่ทำเอง เพียงแต่ Kubernetes จัดการวงจรชีวิตของ container ให้อัตโนมัติในระดับ cluster แทนที่จะให้คนคอยรันคำสั่งเอง