Tag Archive Singleton

Byphunsanit

Docker: ป้องกันซ้ำ / ชน container_name

การที่ใส่ container_name นอกจากจะคุมชื่อ container ให้สื่อความหมายแล้ว การระบุ container_name: ad-samba คือการ ล็อกชื่อ Container ไว้ที่ระดับเครื่อง Host ซึ่งมีผลในการป้องกันการรันซ้ำให้มี “ตัวเดียว” ( Singleton ) ดังนี้ครับ


ป้องกัน Container แบบเดียวกัน run พร้อมกัน

  1. ป้องกันการ Scale ( ในโปรเจกต์เดียวกัน )
    หากคุณพยายามใช้คำสั่งเพื่อขยายเครื่อง ( Scale ) เช่น
    docker-compose up --scale samba=2
    Docker จะแจ้งเตือน Error ทันที เพราะมันไม่สามารถสร้าง Container ชื่อ ad-samba ขึ้นมาซ้ำเป็นตัวที่สองได้ในเวลาเดียวกัน
  2. ป้องกันการชนกัน ( ระหว่างโปรเจกต์ )
    สมมติว่าคุณมีไฟล์ Docker Compose 2 ชุด อยู่คนละโฟลเดอร์กัน ( คนละ Project Name ) แต่ทั้งคู่ดันเขียนว่า container_name: ad-samba เหมือนกัน
    • ถ้าตัวแรกกำลังรันอยู่ ตัวที่สองจะสั่ง up ไม่ขึ้น
    • Docker จะฟ้องว่าชื่อ Container นี้ถูกใช้งานอยู่แล้วโดย Container ID อื่น

ข้อควรระวัง ( สิ่งที่มัน “ไม่ป้องกัน” )

แม้ว่าจะป้องกันการรันชื่อซ้ำได้ แต่ยังมีจุดที่ต้องระวังเพื่อให้ระบบของคุณทำงานได้เสถียรครับ

  • Port Collision: ถึงแม้คุณจะลบ container_name ออกเพื่อให้รัน 2 ตัวได้ แต่ถ้าทั้งคู่พยายามจะ Bind ไปที่ Port เดียวกันบนเครื่อง Host (เช่น Port 445 ของ Samba) ตัวที่สองก็สแต็กไม่ขึ้นอยู่ดีเพราะ Port เต็ม จะเจอได้บ่อย ๆ คือ ถ้าใช้ MySQL และ MariaDB
  • Zombie Container: บางครั้งถ้า Container ตัวเก่า “ค้าง” ( Status เป็น Exited แต่ยังไม่ได้ถูก Remove ) คุณจะสั่งรันตัวใหม่ไม่ได้จนกว่าจะสั่ง docker rm ad-mariadb ก่อน
  • Data Integrity: หากคุณรัน Samba 2 ตัวโดยชี้ไปที่ Volume เดียวกัน ( เช่น ./data:/var/lib/samba ) อาจเกิดปัญหาไฟล์พัง ( Data Corruption ) ได้ เพราะ Samba ไม่ได้ถูกออกแบบมาให้เขียนไฟล์ทับซ้อนกันจากสองแหล่งพร้อมกันแบบดิบ ๆ

สรุป

การใส่ container_name เป็นวิธีที่ดีในการ “บังคับให้มีได้แค่ตัวเดียว” ( Singleton ) บนเครื่องนั้นๆ ครับ เหมาะมากสำหรับ Service ที่เป็นโครงสร้างพื้นฐานอย่าง Active Directory ( AD DC ) หรือ Database


อ่านเพิ่มเติม