ข้ามไปยังเนื้อหา

วงจรชีวิตของ Container

docker run เป็นคำสั่งที่ใช้บ่อยที่สุด จะ pull image ถ้าจำเป็น, สร้าง container, และเริ่มการทำงาน

Terminal window
docker run nginx:alpine

คำสั่งนี้รัน nginx ใน foreground — terminal ของคุณจะ attach กับ output ของตัวเอง กด Ctrl+C เพื่อหยุด

เพิ่ม -d เพื่อรัน container ในเบื้องหลัง:

Terminal window
docker run -d nginx:alpine

Docker จะแสดง container ID เต็มและคืน prompt ทันที

Docker จะกำหนดชื่อแบบสุ่มโดยค่าเริ่มต้น ใช้ --name เพื่อตั้งชื่อที่คาดเดาได้:

Terminal window
docker run -d --name webserver nginx:alpine
Terminal window
# เฉพาะ container ที่กำลังทำงาน
docker ps
# container ทั้งหมด — ทั้งที่กำลังทำงานและหยุดแล้ว
docker ps -a
CONTAINER ID IMAGE STATUS NAMES
a1b2c3d4e5f6 nginx:alpine Up 2 minutes webserver
b7c8d9e0f1a2 alpine Exited (0) 5 minutes ago old-task

คอลัมน์ STATUS บอกว่า container กำลังทำงาน (Up) หรือหยุดแล้ว (Exited)

Terminal window
# หยุดอย่างสุภาพ — ส่ง SIGTERM, รอ 10 วินาที, แล้วจึง SIGKILL
docker stop webserver
# เริ่ม container ที่หยุดอยู่
docker start webserver
# รีสตาร์ท (หยุดแล้วเริ่มใหม่)
docker restart webserver

docker stop ไม่ได้ ลบ container ออก ตัว container ยังคงอยู่บนดิสก์ในสถานะหยุด

Terminal window
# ลบ container ที่หยุดอยู่
docker rm webserver
# บังคับลบ container ที่กำลังทำงาน (ส่ง SIGKILL)
docker rm -f webserver

คุณไม่สามารถลบ container ที่กำลังทำงานได้โดยไม่ใช้ -f

สำหรับงานที่ทำครั้งเดียวและไม่ต้องการจัดการด้วยตนเอง ให้เพิ่ม --rm Container จะถูกลบอัตโนมัติทันทีที่ process สิ้นสุด

Terminal window
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"
ตัวเลือกBenefitCost
รันแบบ 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 แทนที่จะให้คนคอยรันคำสั่งเอง

'docker stop' ส่ง signal อะไรไปยัง process หลักของ container เป็นอันดับแรก?
คำสั่งใดแสดง container ทั้งหมด รวมถึงที่หยุดแล้วด้วย?
flag --rm ทำหน้าที่อะไร?
สามารถลบ container ที่กำลังทำงานอยู่โดยไม่ใช้ flag -f ได้หรือไม่?