การรัน Containers
วัดบน Docker Desktop 4.81.0 / Engine 29.6.1 (macOS, linux/arm64), 2026-09-30
container คืออะไร?
หัวข้อที่มีชื่อว่า “container คืออะไร?”image คือ blueprint ส่วน container คือ instance ที่มีชีวิตและกำลังทำงานของ blueprint นั้น — process ที่ถูกแยกตัว มีมุมมอง filesystem, network และพื้นที่ process ของตัวเอง โดยทั้งหมดแชร์ kernel ของ host
คุณรันหลาย container จาก image เดียวกันได้ หยุดและเริ่มใหม่ ตรวจ log และลบทิ้งเมื่อเสร็จ การเข้าใจวงจรชีวิตนี้เป็นรากฐานของการทำงานกับ Docker ในแต่ละวัน
วงจรชีวิตของ container
หัวข้อที่มีชื่อว่า “วงจรชีวิตของ container”engine รายงานหนึ่งใน เจ็ด state ผ่าน docker inspect --format '{{.State.Status}}' (สรุปสี่ state แบบเดิม “created, running, stopped, removed” ตกหล่น state ที่คุณจะเจอตอน debug):
| State | ความหมาย | ไปถึงได้อย่างไร (พิสูจน์แล้ว) |
|---|---|---|
| created | container มีอยู่แต่ process ยังไม่เคยถูก start | docker create, Status=created |
| running | process หลักกำลังทำงาน | docker start / docker run |
| paused | process ถูกแช่แข็งด้วย cgroup freezer; หน่วยความจำยังถูกจองไว้ | docker pause → Status=paused Running=true Paused=true, ps แสดง Up … (Paused) |
| restarting | restart policy กำลังรอระหว่างความพยายามครั้งต่อไปหลัง exit | --restart always กับคำสั่งที่ exit 1 → Status=restarting ExitCode=1, ps แสดง Restarting (1) |
| exited | process หลักจบแล้ว (หรือ docker stop) container, writable layer, log และ exit code ยังอยู่บนดิสก์ | docker stop → Status=exited ExitCode=137 สำหรับ sleep ที่เมิน SIGTERM |
| removing | docker rm กำลังทำงาน อยู่สั้นมาก | อยู่ใน status filter ของ docker container ls |
| dead | container ที่ “defunct”: การลบสำเร็จเพียงบางส่วนเพราะมีบางอย่างถือ resource ไว้ start ใหม่ไม่ได้ ลบได้อย่างเดียว (ตามเอกสาร) พบยาก — เราสร้างตามสั่งไม่ได้ | ตารางเดียวกันในเอกสาร |
หลัง docker rm เสร็จจะไม่มี state ใดเหลืออีก: มันลบ container และ writable layer ของมัน แล้ว container ก็หายไปจากทุกที่
flowchart LR created["created"] -->|docker start| running["running"] running -->|docker pause| paused["paused"] paused -->|docker unpause| running running -->|process exits or docker stop| exited["exited"] exited -->|docker start| running running -->|crash with a restart policy| restarting["restarting"] restarting --> running exited -->|docker rm| removed["gone (removed)"] created -->|docker rm| removed
บรรทัด docker inspect จริงของ state ที่พิสูจน์แล้ว:
created Status=created Running=false Paused=false Restarting=false ExitCode=0running Status=running Running=true Paused=false Restarting=false ExitCode=0paused Status=paused Running=true Paused=true Restarting=false ExitCode=0exited Status=exited Running=false Paused=false Restarting=false ExitCode=137restarting Status=restarting Running=true Paused=false Restarting=true ExitCode=1สังเกต Running=true ขณะ paused หรือ restarting: เมื่อต้องการ state ที่แน่นอนให้กรองด้วย .State.Status ไม่ใช่ .State.Running
docker run → created + runningdocker stop → exiteddocker start → running again (same container, same writable layer)docker rm → removed (gone)โมดูลนี้ครอบคลุมอะไร
หัวข้อที่มีชื่อว่า “โมดูลนี้ครอบคลุมอะไร”| บทเรียน | หัวข้อ |
|---|---|
| Lifecycle | docker run, docker ps, docker stop/start/restart, docker rm, --rm, exit code |
| Exec & Logs | docker exec -it, docker logs, docker top, attach, การหมุนเวียน log |
| Ports & Env | publish port ด้วย -p, environment variable ด้วย -e / --env-file, ตั้งชื่อด้วย --name |
| Restart & Inspect | restart policy, docker inspect, docker stats, resource limit |
Demo เร็ว — รัน แสดงรายการ และหยุด
หัวข้อที่มีชื่อว่า “Demo เร็ว — รัน แสดงรายการ และหยุด”คำสั่งที่คุณจะใช้บ่อยที่สุดในโมดูลนี้:
#!/bin/sh# Pull and run nginx in the backgrounddocker run -d --name demo nginx:1.31-alpine# List running containersdocker ps# Stop itdocker stop demo# Remove itdocker rm demoCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESc0d6336221c2 nginx:1.31-alpine "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 80/tcp demo80/tcp ที่ไม่มีลูกศรหมายความว่า image ประกาศ port 80 (EXPOSE) แต่ไม่มีอะไรถูก publish ไปยัง host
# Pull and run nginx detached
docker run -d --name demo nginx:1.31-alpine
# Confirm it is running
docker ps
# Stop the container
docker stop demo
# Remove it
docker rm demo
# Confirm it is gone
docker ps -aReading AI-generated code
หัวข้อที่มีชื่อว่า “Reading AI-generated code”probe เช็คสุขภาพสำหรับสคริปต์ deploy ที่ AI เขียน:
🐛 หา bug ในโค้ดนี้
#!/bin/sh# AI: "fail the deploy if the web container is not running"if [ -z "$(docker ps -q --filter name=web)" ]; thenecho "web is down" >&2exit 1fiecho "web is up"เฉลย
--filter name= เป็นการจับคู่แบบ substring/regex บนชื่อ container ไม่ใช่การเทียบเท่ากัน ถ้า container web ตัวจริงหายไปแต่มี container ชื่อ webhook (หรือ web-old) รันอยู่ probe ก็ผ่าน ทำซ้ำได้โดยย่อชื่อจาก docker-b1-web / docker-b1-webhook (มีเฉพาะตัวที่สอง):
$ docker ps -q --filter name=web | wc -l1$ docker ps --filter name=web --format '{{.Names}}'webhook$ docker ps -q --filter 'name=^web$' | wc -l0$ docker inspect -f '{{.State.Running}}' weberror: no such object: webให้ anchor pattern หรือดีกว่านั้นคือถามถึง container ที่ตรงตัวและ state ของมัน:
#!/bin/shset -eustate=$(docker inspect -f '{{.State.Status}}' web 2>/dev/null || echo missing)if [ "$state" != "running" ]; then echo "web is $state" >&2 exit 1fiecho "web is up"docker inspect กับ container ที่ไม่มีอยู่จะ exit ไม่เป็นศูนย์พร้อม no such object ซึ่ง || echo missing เปลี่ยนให้เป็น state แทนที่จะผ่านโดยบังเอิญ
Mental Model
หัวข้อที่มีชื่อว่า “Mental Model”container คือ แถวในฐานข้อมูลของ engine บวก process (ตอนรัน) บวก writable layer บนดิสก์ docker stop จบแค่ process; แถวและ layer อยู่ต่อจนกว่าจะ docker rm ความสับสนส่วนใหญ่ในโมดูลนี้ — “container ฉันหายไปไหน”, “ทำไมดิสก์เต็ม”, “ทำไมชื่อชนกัน” — มาจากการลืมว่าแถวอยู่ได้นานกว่า process
Trade-offs
หัวข้อที่มีชื่อว่า “Trade-offs”| ทางเลือก | ข้อดี | ข้อเสีย |
|---|---|---|
| เก็บ container ที่ exit แล้ว | exit code, log และ writable layer ยังตรวจสอบได้ | สะสมดิสก์และครองชื่อ |
--rm | container แบบใช้ครั้งเดียวที่ล้างตัวเอง | ไม่เหลืออะไรให้ตรวจหลัง crash |
docker pause | แช่แข็งโดยไม่เสีย memory state หรือ PID | หน่วยความจำยังถูกจองไว้; peer บน network เห็น service ค้าง |
Common Misconceptions
หัวข้อที่มีชื่อว่า “Common Misconceptions”- “container ที่หยุดแล้วถูกลบ” มันเป็น
exitedและdocker ps -aยังแสดงอยู่พร้อม writable layer - “Running=true แปลว่า process กำลังทำงาน” container ที่ paused ก็รายงาน
Running=trueให้ตรวจ.State.Status - “
docker psแสดงทุก container” แสดงเฉพาะที่รัน (และ paused/restarting) ใส่-aเพื่อดูที่เหลือ - “
docker ps --filter name=xหา containerx” มันหาทุก container ที่ชื่อมีxหรือตรงกับx