การจัดการ Docker Container: Start, Stop, Restart, Remove
ในบทที่แล้ว เราได้ลองรัน Docker Container ตัวแรกของเราโดยใช้ Image hello-world และเรียนรู้วิธีการตรวจสอบ Container ที่เคยรันไปแล้ว ในบทนี้ เราจะเจาะลึกลงไปในการจัดการ Container ที่มีอยู่ ไม่ว่าจะเป็นการเริ่มต้น, หยุด, รีสตาร์ท, และลบ Container เพื่อให้คุณสามารถควบคุมการทำงานของ Container ได้อย่างเต็มที่
ทำความเข้าใจสถานะของ Container
ก่อนที่เราจะเริ่มจัดการ Container เรามาทำความเข้าใจสถานะต่างๆ ของ Container กันก่อน Container สามารถอยู่ในสถานะต่างๆ ได้ดังนี้:
- Created: Container ถูกสร้างขึ้นแล้ว แต่ยังไม่ได้เริ่มทำงาน
- Running: Container กำลังทำงานอยู่
- Stopped: Container หยุดทำงานแล้ว
- Paused: Container หยุดการทำงานชั่วคราว (จะกล่าวถึงในบทต่อๆ ไป)
- Restarting: Container กำลังทำการรีสตาร์ท
- Exited: Container หยุดทำงานเนื่องจากกระบวนการหลักภายใน Container เสร็จสิ้นหรือเกิดข้อผิดพลาด
สถานะเหล่านี้สำคัญเพราะมีผลต่อคำสั่งที่เราสามารถใช้จัดการ Container ได้
คำสั่ง docker start: เริ่มต้น Container ที่หยุดทำงาน
คำสั่ง docker start ใช้เพื่อเริ่มต้น Container ที่อยู่ในสถานะ Stopped หรือ Created เท่านั้น Container ที่กำลัง Running อยู่แล้ว จะไม่สามารถใช้คำสั่งนี้ได้
ไวยากรณ์:
docker start [OPTIONS] CONTAINER [CONTAINER...]
โดย CONTAINER คือ ID หรือชื่อของ Container ที่ต้องการเริ่มต้น
ตัวอย่าง:
สมมติว่าเรามี Container ชื่อ my-container ที่อยู่ในสถานะ Stopped เราสามารถเริ่มต้น Container นี้ได้โดยใช้คำสั่ง:
docker start my-container
หรือถ้าเราทราบ Container ID (เช่น a1b2c3d4e5f6) เราก็สามารถใช้ Container ID แทนได้:
docker start a1b2c3d4e5f6
หลังจากรันคำสั่งนี้ Docker จะเริ่ม Container และมันจะเข้าสู่สถานะ Running
เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:
การใช้ docker start มีประโยชน์เมื่อคุณต้องการรัน Container ที่เคยหยุดไปแล้ว โดยไม่ต้องสร้าง Container ใหม่ทั้งหมด ซึ่งช่วยประหยัดเวลาและทรัพยากร นอกจากนี้ การใช้ชื่อ Container แทน Container ID ช่วยให้จำง่ายและลดโอกาสที่จะเกิดข้อผิดพลาดจากการพิมพ์ ID ที่ยาวเหยียด
คำสั่ง docker stop: หยุด Container ที่กำลังทำงาน
คำสั่ง docker stop ใช้เพื่อหยุด Container ที่กำลังอยู่ในสถานะ Running คำสั่งนี้จะส่งสัญญาณ SIGTERM ไปยังกระบวนการหลักภายใน Container เพื่อให้กระบวนการนั้นหยุดทำงานอย่างเรียบร้อย (gracefully)
ไวยากรณ์:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
โดย CONTAINER คือ ID หรือชื่อของ Container ที่ต้องการหยุด
ตัวอย่าง:
หาก my-container กำลังทำงานอยู่ เราสามารถหยุดมันได้ด้วยคำสั่ง:
docker stop my-container
หรือใช้ Container ID:
docker stop a1b2c3d4e5f6
โดยปกติ Docker จะรอเป็นระยะเวลาหนึ่ง (default คือ 10 วินาที) ให้ Container หยุดทำงานอย่างเรียบร้อย ถ้า Container ยังไม่หยุดหลังจากระยะเวลานี้ Docker จะส่งสัญญาณ SIGKILL ซึ่งเป็นการบังคับให้ Container หยุดทำงานทันที
เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:
การใช้ docker stop เป็นวิธีที่แนะนำในการหยุด Container เพราะช่วยให้กระบวนการภายใน Container สามารถบันทึกข้อมูลหรือทำความสะอาดทรัพยากรก่อนที่จะหยุดทำงาน ซึ่งป้องกันการสูญเสียข้อมูลหรือความเสียหายที่อาจเกิดขึ้นจากการหยุด Container อย่างกะทันหัน
ข้อควรระวัง: หากคุณต้องการหยุด Container ทันทีโดยไม่รอให้มันหยุดอย่างเรียบร้อย คุณสามารถใช้คำสั่ง docker kill (จะไม่กล่าวถึงในบทนี้) ซึ่งจะส่งสัญญาณ SIGKILL ไปยัง Container ทันที
คำสั่ง docker restart: รีสตาร์ท Container
คำสั่ง docker restart ใช้เพื่อรีสตาร์ท Container โดย Docker จะทำการหยุด Container (ด้วย docker stop) และเริ่มต้น Container ใหม่ (ด้วย docker start) ในขั้นตอนเดียว
ไวยากรณ์:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
โดย CONTAINER คือ ID หรือชื่อของ Container ที่ต้องการรีสตาร์ท
ตัวอย่าง:
docker restart my-container
หรือใช้ Container ID:
docker restart a1b2c3d4e5f6
เช่นเดียวกับ docker stop Docker จะรอเป็นระยะเวลาหนึ่งให้ Container หยุดทำงานอย่างเรียบร้อยก่อนที่จะเริ่มต้นใหม่
เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:
docker restart มีประโยชน์เมื่อคุณต้องการรีสตาร์ท Container อย่างรวดเร็วโดยไม่ต้องรัน docker stop และ docker start แยกกัน นอกจากนี้ ยังสามารถใช้เพื่อแก้ไขปัญหาชั่วคราวที่อาจเกิดขึ้นกับ Container ได้ เช่น Container ค้างหรือทำงานผิดปกติ
คำสั่ง docker rm: ลบ Container
คำสั่ง docker rm ใช้เพื่อลบ Container ที่อยู่ในสถานะ Stopped หรือ Exited เท่านั้น Container ที่กำลัง Running อยู่ จะไม่สามารถลบได้
ไวยากรณ์:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
โดย CONTAINER คือ ID หรือชื่อของ Container ที่ต้องการลบ
ตัวอย่าง:
สมมติว่า my-container อยู่ในสถานะ Stopped เราสามารถลบมันได้ด้วยคำสั่ง:
docker rm my-container
หรือใช้ Container ID:
docker rm a1b2c3d4e5f6
หากคุณต้องการลบ Container ที่กำลังทำงานอยู่ คุณจะต้องหยุดมันก่อนด้วย docker stop แล้วจึงใช้ docker rm หรือคุณสามารถใช้ option -f หรือ --force เพื่อบังคับให้ลบ Container ที่กำลังทำงานอยู่ได้ (ไม่แนะนำ เว้นแต่จำเป็นจริงๆ เพราะอาจทำให้ข้อมูลเสียหายได้)
ตัวอย่างการบังคับลบ Container:
docker rm -f my-container
เหตุผลเชิงออกแบบและแนวปฏิบัติที่ดี:
การลบ Container ที่ไม่ได้ใช้งานแล้วช่วยประหยัดพื้นที่ดิสก์และลดความซับซ้อนในการจัดการ Docker นอกจากนี้ ควรหลีกเลี่ยงการบังคับลบ Container ที่กำลังทำงานอยู่ เว้นแต่จำเป็นจริงๆ เพราะอาจทำให้ข้อมูลเสียหายหรือระบบไม่เสถียร
ข้อควรระวัง: เมื่อคุณลบ Container ข้อมูลที่อยู่ใน Container นั้นจะหายไป หากคุณต้องการเก็บข้อมูลไว้ คุณควรใช้ Volume (จะกล่าวถึงในบทต่อๆ ไป) เพื่อเก็บข้อมูลไว้ภายนอก Container
สรุป
ในบทนี้ เราได้เรียนรู้วิธีการจัดการ Docker Container โดยใช้คำสั่ง docker start, docker stop, docker restart, และ docker rm ซึ่งเป็นเครื่องมือพื้นฐานที่สำคัญในการควบคุมการทำงานของ Container การทำความเข้าใจสถานะของ Container และการใช้คำสั่งเหล่านี้อย่างถูกต้อง จะช่วยให้คุณสามารถจัดการ Docker Container ได้อย่างมีประสิทธิภาพและปลอดภัย ในบทต่อไป เราจะเรียนรู้วิธีการสร้าง Docker Image ของตัวเอง ซึ่งจะทำให้คุณสามารถสร้าง Container ที่มีสภาพแวดล้อมและการตั้งค่าที่คุณต้องการได้อย่างง่ายดาย