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