การที่ใส่ container_name นอกจากจะคุมชื่อ container ให้สื่อความหมายแล้ว การระบุ container_name: ad-samba คือการ ล็อกชื่อ Container ไว้ที่ระดับเครื่อง Host ซึ่งมีผลในการป้องกันการรันซ้ำให้มี “ตัวเดียว” ( Singleton ) ดังนี้ครับ
ป้องกัน Container แบบเดียวกัน run พร้อมกัน
- ป้องกันการ Scale ( ในโปรเจกต์เดียวกัน )
หากคุณพยายามใช้คำสั่งเพื่อขยายเครื่อง ( Scale ) เช่นdocker-compose up --scale samba=2
Docker จะแจ้งเตือน Error ทันที เพราะมันไม่สามารถสร้าง Container ชื่อad-sambaขึ้นมาซ้ำเป็นตัวที่สองได้ในเวลาเดียวกัน - ป้องกันการชนกัน ( ระหว่างโปรเจกต์ )
สมมติว่าคุณมีไฟล์ 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 rmad-mariadb ก่อน - Data Integrity: หากคุณรัน Samba 2 ตัวโดยชี้ไปที่ Volume เดียวกัน ( เช่น
./data:/var/lib/samba) อาจเกิดปัญหาไฟล์พัง ( Data Corruption ) ได้ เพราะ Samba ไม่ได้ถูกออกแบบมาให้เขียนไฟล์ทับซ้อนกันจากสองแหล่งพร้อมกันแบบดิบ ๆ
สรุป
การใส่ container_name เป็นวิธีที่ดีในการ “บังคับให้มีได้แค่ตัวเดียว” ( Singleton ) บนเครื่องนั้นๆ ครับ เหมาะมากสำหรับ Service ที่เป็นโครงสร้างพื้นฐานอย่าง Active Directory ( AD DC ) หรือ Database
อ่านเพิ่มเติม
