รัน docker run ด้วยชื่อ container เดิมที่เคยใช้มาก่อน แล้วเจอข้อความแบบนี้
docker: Error response from daemon: Conflict. The container name "/my-app" is already in use by container "a1b2c3d4e5f6". You have to remove (or rename) that container to be able to reuse that name.
พูดง่ายๆ error container name is already in use นี้ไม่ได้แปลว่าเครื่องพัง หรือ Docker เสีย มันแค่บอกตรงๆ ว่ามี container ชื่อเดียวกันนี้อยู่แล้วในเครื่อง (ไม่ว่าจะกำลังรันอยู่หรือหยุดไปแล้วก็ตาม) และ Docker ไม่ยอมให้ตั้งชื่อซ้ำ บทความนี้จะอธิบายสาเหตุจริงๆ พร้อมวิธีแก้ที่ใช้ได้ทุกกรณี
สาเหตุที่แท้จริง
ใน Docker ทุก container ต้องมีชื่อไม่ซ้ำกัน (ถ้าไม่ตั้งชื่อเอง Docker จะสุ่มชื่อแปลกๆ ให้อัตโนมัติ เช่น happy_einstein) เมื่อคุณสั่ง docker run --name my-app ... แล้ว container ชื่อ my-app ถูกสร้างไปแล้วครั้งหนึ่ง — แม้ container นั้นจะหยุดทำงาน (stopped/exited) ไปแล้ว ชื่อก็ยังถูกจองอยู่ Docker ไม่ได้ลบ container ทิ้งอัตโนมัติแค่เพราะมันหยุดทำงาน ต้องสั่งลบเองเท่านั้น
นี่คือจุดที่มือใหม่งงบ่อยที่สุด: คิดว่า container ที่ปิดไปแล้ว “หายไป” เหมือนปิดโปรแกรมทั่วไป แต่จริงๆ แล้วมันยังอยู่ในสถานะ “Exited” รอให้ลบหรือสั่งรันต่อ เปรียบเทียบง่ายๆ container ก็เหมือนแฟ้มเอกสารที่ยังวางอยู่บนโต๊ะแม้จะปิดไฟล์ที่เปิดอ่านอยู่ไปแล้ว ต้องมีคนหยิบไปทิ้งถังขยะเองถึงจะหายไปจริง Docker ไม่ทำขั้นตอนนั้นให้อัตโนมัติเพราะบางครั้งผู้ใช้ยังต้องการดู log หรือกู้ข้อมูลกลับมาจาก container ที่หยุดไปแล้ว
เช็คก่อนว่ามี container ชื่อนี้อยู่จริงไหม
ใช้คำสั่งนี้เพื่อดู container ทั้งหมด รวมที่หยุดทำงานแล้วด้วย (ปกติ docker ps เฉยๆ จะโชว์แค่ตัวที่กำลังรันอยู่)
docker ps -a
จะเห็นตารางแสดง container ทั้งหมด พร้อมคอลัมน์ NAMES และ STATUS ถ้าเจอชื่อที่ตรงกับ error ที่ขึ้นมา (เช่น my-app) และ STATUS ขึ้นว่า Exited (0) 2 hours ago แปลว่าตัวนี้แหละคือตัวที่ชนกันอยู่
3 วิธีแก้ error container name is already in use
วิธีที่ 1: ลบ container เก่าทิ้งแล้วสร้างใหม่ (ใช้บ่อยที่สุด)
ถ้า container เก่าไม่มีข้อมูลสำคัญที่ต้องเก็บไว้ วิธีที่เร็วและตรงไปตรงมาที่สุดคือลบทิ้งแล้วรันคำสั่งเดิมใหม่
docker rm my-app docker run --name my-app ...
ถ้า container ยังรันอยู่ (ไม่ใช่แค่ stopped) ต้องหยุดก่อนถึงจะลบได้ หรือใช้ flag -f เพื่อบังคับลบทันทีโดยไม่ต้องหยุดก่อน
docker rm -f my-app
วิธีที่ 2: เปลี่ยนไปใช้ชื่ออื่นแทน
ถ้าต้องการเก็บ container เก่าไว้เผื่อกลับมาดู log หรือข้อมูลทีหลัง ไม่อยากลบทิ้ง ให้ตั้งชื่อใหม่ตอนรันแทน
docker run --name my-app-v2 ...
วิธีนี้เหมาะกับตอนทดสอบหลายเวอร์ชันคู่ขนานกัน หรือยังไม่แน่ใจว่า container เก่ามีอะไรสำคัญอยู่ข้างในหรือเปล่า
วิธีที่ 3: สั่งรัน container เดิมต่อแทนการสร้างใหม่
ถ้า container เดิมมีข้อมูลหรือการตั้งค่าที่ต้องการเก็บไว้ (เช่น container ฐานข้อมูลที่มี volume ผูกอยู่) สิ่งที่ต้องการจริงๆ อาจไม่ใช่การสร้างใหม่ แต่คือ เริ่ม container เดิมที่หยุดอยู่ให้กลับมาทำงานต่อ
docker start my-app
ต่างจาก docker run ตรงที่ docker start ไม่ได้สร้าง container ใหม่เลย แค่สั่งให้ container ที่มีอยู่แล้ว (แต่หยุดอยู่) กลับมาทำงาน จึงไม่ชนกับชื่อเดิม และข้อมูลทั้งหมดที่เคยมีก็ยังอยู่ครบ
ทำความเข้าใจ docker run vs docker start ให้ชัด
ความสับสนเรื่อง container name ซ้ำมักมาจากการไม่เข้าใจความต่างระหว่างสองคำสั่งนี้
docker run = สร้าง container ใหม่ จาก image แล้วรันทันที ทุกครั้งที่สั่งคำสั่งนี้คือการสร้างตัวใหม่เอี่ยม ถ้าใช้ชื่อซ้ำกับตัวที่มีอยู่แล้ว (ไม่ว่าจะรันอยู่หรือหยุดอยู่) จะเจอ error ทันที
docker start = เริ่มการทำงานของ container ที่มีอยู่แล้ว ให้กลับมารันต่อ ไม่ได้สร้างใหม่ ใช้ได้กับ container ที่อยู่ในสถานะ “Exited” เท่านั้น ถ้า container นั้นถูกลบไปแล้วจะสั่ง start ไม่ได้
จำง่ายๆ ว่า run คือ “สร้างใหม่” ส่วน start คือ “ปลุกตัวเดิมให้ตื่น” เข้าใจตรงนี้แล้วจะไม่งงเรื่อง name conflict อีกต่อไป
วิธีป้องกันไม่ให้เจอ error นี้ซ้ำอีก
ใช้ flag --rm กับ container ที่ใช้ทดสอบชั่วคราว — ถ้ารัน container เพื่อทดสอบเร็วๆ แล้วไม่ต้องการเก็บไว้ต่อ ใส่ --rm ตอนรัน Docker จะลบ container ให้อัตโนมัติทันทีที่หยุดทำงาน ไม่ต้องมาลบเองทีหลังและไม่มีทางชนชื่อซ้ำ
docker run --rm --name my-app-test ...
เช็คก่อนรันเสมอด้วย docker ps -a — สร้างนิสัยเช็คก่อนสั่ง docker run ที่ใช้ --name ซ้ำ โดยเฉพาะเวลารัน script หรือคำสั่งเดิมซ้ำหลายรอบระหว่างพัฒนา
ใช้ Docker Compose แทนถ้าต้อง restart บ่อย — ถ้าโปรเจกต์มีหลาย container ที่ต้อง restart บ่อยระหว่างพัฒนา ใช้ docker compose down ก่อน docker compose up ทุกครั้งจะสะดวกและปลอดภัยกว่ามาก เพราะ Compose จัดการลบ/สร้าง container ให้ทั้งชุดอัตโนมัติ ไม่ต้องมาไล่ docker rm ทีละตัวเอง
เปลี่ยนชื่อ container เดิมด้วย docker rename แทนก็ได้
นอกจากลบหรือรันชื่อใหม่ ยังมีอีกทางเลือกหนึ่งที่หลายคนมองข้าม คือเปลี่ยนชื่อ container เก่าออกไปก่อน เพื่อคืนชื่อเดิมให้ container ใหม่ใช้ได้ทันทีโดยไม่ต้องลบข้อมูลอะไรทิ้ง
docker rename my-app my-app-old docker run --name my-app ...
วิธีนี้เหมาะมากตอนกำลัง deploy เวอร์ชันใหม่แต่ยังอยากเก็บ container เวอร์ชันเก่าไว้เป็น backup ชั่วคราว เผื่อเวอร์ชันใหม่มีปัญหาแล้วต้องสลับกลับไปใช้ตัวเดิมอย่างเร่งด่วน หลังจากมั่นใจว่าเวอร์ชันใหม่ทำงานถูกต้องแล้ว ค่อยลบตัวเก่า (my-app-old) ทิ้งทีหลังได้ตามสบาย
เจอ error นี้บ่อยตอนไหนบ้าง
รัน script deploy ซ้ำหลายรอบ — เขียน shell script ที่มี docker run --name my-app ... อยู่ในนั้น แล้วรัน script ซ้ำโดยไม่มีขั้นตอนลบ container เก่าก่อน เป็นสาเหตุที่พบบ่อยที่สุดในทีมที่เพิ่งเริ่มทำ deployment script เอง
restart Docker Desktop แล้ว container เก่าโผล่กลับมา — บางครั้ง container ที่เคย docker rm แล้วดูเหมือนหายไป แต่จริงๆ ยังค้างอยู่ในสถานะแปลกๆ หลัง Docker Desktop restart ไม่คาดคิด เช็ค docker ps -a อีกครั้งให้ชัวร์ก่อนสรุปว่าลบสำเร็จจริง
รัน docker-compose up ซ้ำโดยไม่ผ่าน down ก่อน — ถ้าเปลี่ยนชื่อ service ใน docker-compose.yml หรือแก้ container_name เอง Compose อาจพยายามสร้าง container ใหม่ที่ชื่อชนกับตัวเก่าที่ยังไม่ได้ถูกเคลียร์
คำถามที่พบบ่อย
ลบ container ด้วย docker rm แล้วข้อมูลข้างในหายไหม ขึ้นอยู่กับว่าข้อมูลนั้นเก็บอยู่ที่ไหน ถ้าเก็บอยู่ใน container เอง (ไม่ได้ผูก volume แยก) ข้อมูลจะหายไปพร้อมกับ container ที่ถูกลบ แต่ถ้าใช้ named volume หรือ bind mount ผูกไว้ ข้อมูลจะยังอยู่ที่ volume ต่างหาก ไม่หายไปแม้ลบ container ทิ้ง สามารถผูก volume เดิมเข้ากับ container ใหม่ได้ทันที
ทำไม Docker ไม่ลบ container เก่าให้อัตโนมัติทุกครั้งที่หยุด เพราะ container ที่หยุดทำงานอาจยังมี log, การตั้งค่า หรือข้อมูลที่ต้องการดูย้อนหลัง Docker เลยเก็บไว้ให้เป็นค่าเริ่มต้น ถ้าต้องการให้ลบอัตโนมัติทุกครั้งที่หยุด ต้องระบุ --rm เองตอนรันเสมอ
docker rm กับ docker rmi ต่างกันยังไง docker rm ลบ container (instance ที่รันจาก image) ส่วน docker rmi ลบ image (ต้นแบบที่ใช้สร้าง container) ต้องลบ container ที่ใช้ image นั้นอยู่ให้หมดก่อน ถึงจะลบ image ด้วย docker rmi ได้
ลบ container ทุกตัวที่หยุดทำงานพร้อมกันได้ไหม ได้ ใช้คำสั่ง docker container prune เพื่อลบ container ที่อยู่ในสถานะ Exited ทั้งหมดในครั้งเดียว ระบบจะถามยืนยันก่อนลบเสมอ เหมาะกับตอนเครื่องมี container ทดสอบค้างอยู่เยอะจนอยากเคลียร์ทีเดียว
เจอ error นี้ตอนใช้ Docker Compose ต้องแก้ยังไง อาการและสาเหตุเหมือนกันทุกอย่าง แต่แก้ได้สะดวกกว่าด้วยคำสั่งเดียว docker compose down ซึ่งจะลบ container ทุกตัวที่ประกาศไว้ใน docker-compose.yml ให้พร้อมกันทั้งชุด แทนที่จะไล่ docker rm ทีละตัวเหมือนตอนใช้ docker run ตรงๆ จากนั้นค่อยรัน docker compose up ใหม่ได้เลยโดยไม่ชนชื่อ
container_name ใน docker-compose.yml จำเป็นต้องตั้งเองไหม ไม่จำเป็น ถ้าไม่ระบุ container_name เอง Compose จะตั้งชื่อให้อัตโนมัติตามรูปแบบ <ชื่อโปรเจกต์>-<ชื่อ service>-<เลข> ซึ่งมีเลขต่อท้ายกันชนกันเองอยู่แล้ว ปัญหา name conflict มักเกิดเฉพาะตอนที่ตั้ง container_name ตายตัวเองในไฟล์ config เท่านั้น
สรุป
error “container name is already in use” เกิดจาก Docker ไม่ยอมให้ตั้งชื่อ container ซ้ำ ไม่ว่า container เดิมจะกำลังรันอยู่หรือหยุดไปแล้วก็ตาม แก้ได้ 3 ทางตามสถานการณ์
- ลบทิ้งแล้วสร้างใหม่ ด้วย
docker rm(หรือdocker rm -fถ้ายังรันอยู่) - เปลี่ยนชื่อใหม่ ถ้าอยากเก็บตัวเก่าไว้ดูทีหลัง
- ใช้
docker startแทนdocker runถ้าแค่ต้องการปลุก container เดิมที่หยุดอยู่กลับมาทำงานต่อ พร้อมข้อมูลเดิมครบ
ป้องกันไม่ให้เจอซ้ำได้ง่ายๆ ด้วยการใส่ --rm กับ container ทดสอบชั่วคราว หรือเช็ค docker ps -a ก่อนรันคำสั่งที่ใช้ --name ซ้ำทุกครั้ง สร้างเป็นนิสัยตั้งแต่ตอนนี้ จะช่วยประหยัดเวลาแก้ error แบบเดิมซ้ำๆ ได้มากในระยะยาว
1 thought on “แก้ error “container name is already in use” ใน Docker”