container แรกของคุณ
container แบบ interactive: เปิด shell ภายใน Ubuntu
หัวข้อที่มีชื่อว่า “container แบบ interactive: เปิด shell ภายใน Ubuntu”การรวม flag -it คือวิธีที่คุณเปิด session terminal แบบ interactive ภายใน container รันคำสั่ง:
docker run -it ubuntu bashเมื่อ Docker ดึง image และเริ่มต้น container แล้ว prompt ของคุณจะเปลี่ยนเป็นลักษณะนี้:
root@3f2e1a9b7c4d:/#ตอนนี้คุณอยู่ภายใน container แล้ว hostname ที่แสดง (3f2e1a9b7c4d) คือ container ID คุณมี environment Ubuntu ที่แยกออกมาอย่างสมบูรณ์ — มี filesystem เป็นของตัวเอง มี process tree เป็นของตัวเอง เมื่อเสร็จแล้ว พิมพ์ exit เพื่อกลับไปยัง shell ของ host container จะหยุดทันทีที่ process bash สิ้นสุด
ความหมายของ flag ต่าง ๆ:
-i— เปิด stdin ค้างไว้เพื่อให้คุณพิมพ์คำสั่งเข้าไปใน container ได้-t— จัดสรร pseudo-TTY เพื่อให้ shell prompt แสดงผลได้ถูกต้องและรองรับ terminal control sequences- เมื่อใช้ร่วมกัน
-itจะให้ session shell แบบ interactive ภายใน container
Web server แบบ detached: รัน Nginx ในพื้นหลัง
หัวข้อที่มีชื่อว่า “Web server แบบ detached: รัน Nginx ในพื้นหลัง”ไม่ใช่ทุก container ที่จำเป็นต้องใช้ session แบบ interactive บริการที่ทำงานต่อเนื่อง เช่น web server และฐานข้อมูล จะถูกเริ่มต้นใน detached mode ด้วย -d เพื่อให้ทำงานในพื้นหลังโดยไม่ครอบครอง terminal ของคุณ:
docker run -d -p 8080:80 nginxรายละเอียด flag:
-d— detached mode: container ทำงานในพื้นหลัง และ Docker จะพิมพ์เฉพาะ container ID เท่านั้น-p 8080:80— publish ports: map host port 8080 ไปยัง container port 80 การรับส่งข้อมูลที่มาถึงlocalhost:8080บนเครื่องของคุณจะถูกส่งต่อไปยัง port 80 ภายใน container นั่นคือที่ที่ Nginx กำลังรับฟัง
หลังจากรันคำสั่งนี้ เปิด http://localhost:8080 ใน browser ของคุณ แล้วคุณจะเห็นหน้าต้อนรับของ Nginx
แสดงรายการ container ที่กำลังทำงานด้วย docker ps
หัวข้อที่มีชื่อว่า “แสดงรายการ container ที่กำลังทำงานด้วย docker ps”เพื่อดูว่ามีอะไรกำลังทำงานอยู่:
docker psผลลัพธ์ที่คาดหวัง:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa1b2c3d4e5f6 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp elegant_morseคอลัมน์เหล่านี้บอกทุกอย่างในมุมมองเดียว: container ID, image ที่ใช้เริ่มต้น, คำสั่งที่ทำงานอยู่ภายใน, ระยะเวลาที่ทำงานมา, สถานะ, การ map port, และชื่อที่สร้างขึ้นโดยอัตโนมัติ
หยุด container
หัวข้อที่มีชื่อว่า “หยุด container”ส่ง container ID (หรือชื่อ) ให้กับ docker stop:
docker stop a1b2c3d4e5f6Docker ส่ง SIGTERM ไปยัง process หลักภายใน container โดยให้เวลาสูงสุด 10 วินาทีในการปิดตัวอย่างถูกต้อง หาก process ยังไม่สิ้นสุดภายในเวลานั้น Docker จะส่ง SIGKILL เพื่อบังคับหยุด
แสดงรายการ container ทั้งหมด (รวมที่หยุดแล้ว)
หัวข้อที่มีชื่อว่า “แสดงรายการ container ทั้งหมด (รวมที่หยุดแล้ว)”เมื่อหยุดแล้ว container จะไม่ปรากฏใน docker ps อีกต่อไป เพิ่ม flag -a เพื่อดูทั้งหมด รวมถึง container ที่ออกจากระบบแล้ว:
docker ps -aสิ่งนี้มีประโยชน์สำหรับการตรวจสอบ exit code, การกู้คืน log, หรือการล้าง container เก่าด้วย docker rm
docker run -d -p 8080:80 nginx
docker ps
docker stop $(docker ps -q --filter ancestor=nginx)
docker ps -aข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
-it (interactive) | เห็น output แบบ real-time debug ง่าย | ต้องเปิด terminal ค้างไว้ container จะหยุดถ้า session ปิด |
-d (detached) | รันเป็น background service ได้ต่อเนื่อง ไม่ครอบครอง terminal | ต้องใช้ docker ps / docker logs เพื่อตรวจสอบ ไม่เห็น output ทันที |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- ลืมใส่
-dแล้ว container ค้าง terminal เพราะรันแบบ foreground โดยไม่ตั้งใจ - รัน
docker runซ้ำหลายครั้งโดยไม่เช็คdocker psก่อน ทำให้มี container หลายตัวรัน service เดียวกันซ้ำซ้อน - ลืมว่า container หยุดทันทีที่ process หลักจบ (เช่น พิมพ์
exitใน-it) แล้วสงสัยว่าทำไม container หายไปจากdocker ps
💡 ตัวอย่างจากของจริง
Netflix และ Spotify รัน microservices เกือบทั้งหมดเป็น container แบบ detached เบื้องหลัง orchestrator อย่าง Kubernetes การเข้าใจความแตกต่างระหว่าง
-itกับ-dตั้งแต่ต้นคือพื้นฐานก่อนจะไปถึงจุดนั้น