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

container แรกของคุณ

การรวม flag -it คือวิธีที่คุณเปิด session terminal แบบ interactive ภายใน container รันคำสั่ง:

Terminal window
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

ไม่ใช่ทุก container ที่จำเป็นต้องใช้ session แบบ interactive บริการที่ทำงานต่อเนื่อง เช่น web server และฐานข้อมูล จะถูกเริ่มต้นใน detached mode ด้วย -d เพื่อให้ทำงานในพื้นหลังโดยไม่ครอบครอง terminal ของคุณ:

Terminal window
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

เพื่อดูว่ามีอะไรกำลังทำงานอยู่:

Terminal window
docker ps

ผลลัพธ์ที่คาดหวัง:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp elegant_morse

คอลัมน์เหล่านี้บอกทุกอย่างในมุมมองเดียว: container ID, image ที่ใช้เริ่มต้น, คำสั่งที่ทำงานอยู่ภายใน, ระยะเวลาที่ทำงานมา, สถานะ, การ map port, และชื่อที่สร้างขึ้นโดยอัตโนมัติ

ส่ง container ID (หรือชื่อ) ให้กับ docker stop:

Terminal window
docker stop a1b2c3d4e5f6

Docker ส่ง SIGTERM ไปยัง process หลักภายใน container โดยให้เวลาสูงสุด 10 วินาทีในการปิดตัวอย่างถูกต้อง หาก process ยังไม่สิ้นสุดภายในเวลานั้น Docker จะส่ง SIGKILL เพื่อบังคับหยุด

เมื่อหยุดแล้ว container จะไม่ปรากฏใน docker ps อีกต่อไป เพิ่ม flag -a เพื่อดูทั้งหมด รวมถึง container ที่ออกจากระบบแล้ว:

Terminal window
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
ตัวเลือกBenefitCost
-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 ตั้งแต่ต้นคือพื้นฐานก่อนจะไปถึงจุดนั้น

flag `-d` ทำอะไรใน `docker run -d`?
`-p 8080:80` หมายความว่าอะไรใน `docker run -d -p 8080:80 nginx`?
คำสั่งใดที่แสดงรายการเฉพาะ container ที่กำลังทำงานอยู่?
`docker stop` ส่ง signal อะไรไปยัง process ของ container ก่อน?