Docker 不允許兩個容器使用同一個名稱

error message:

✘ Contain… Error response from daemon: Conflict. The container name "/mssql_db" is already in use by container "44a71682bce20940b5cf17810ef89e8999a070708b0262b275e796fe845e0b7f". You have to remove (or rename) that container to be able to reuse that name. 0.0s
Error response from daemon: Conflict. The container name "/mssql_db" is already in use by container "44a71682bce20940b5cf17810ef89e8999a070708b0262b275e796fe845e0b7f". You have to remove (or rename) that container to be able to reuse that name.

這個錯誤訊息代表你的電腦裡已經有一個名字叫做 mssql_db 的容器在執行,或者雖然停止了但名稱還被佔用著。Docker 不允許兩個容器使用同一個名稱。

解決方法

你可以選擇以下其中一種方式來處理:

移除舊的容器

如果你不需要原本那個容器,可以直接刪除它,讓新的設定生效。請在終端機輸入:

Bash

docker rm -f mssql_db

執行完後,再次執行 docker compose up 就可以正常啟動了。


使用 Compose 自動重新建立

你可以加上參數,讓 Docker Compose 自動處理掉衝突的容器:

Bash

docker compose up --force-recreate

這樣它會強制移除舊的容器並根據你現在的 yaml 檔案重新建立一個。


修改名稱

如果你想保留原本的容器,那就必須修改 docker-compose.yml 檔案中的 container_name。例如改名為 mssql_db_new:

YAML

services:
  db:
    image: mcr.microsoft.com/azure-sql-edge
    container_name: mssql_db_new

修改完存檔後,再重新執行啟動指令即可。


目前電腦上有哪些容器正在跑嗎?

你可以使用以下指令來查看電腦上目前正在執行的容器:

Bash

docker ps

這個指令會列出所有正在運作中的容器,包含它們的 ID、名稱、使用的映像檔以及埠號對應。

如果你想看到所有的容器,包含那些已經停止(Exited)但名稱還佔用著空間的容器,請使用:

Bash

docker ps -a

這能幫你確認剛才報錯的 mssql_db 是不是處於停止狀態但還沒被移除。


欄位說明

在輸出的表格中,你可以特別留意這幾項:

  • NAMES:容器的名稱,剛才報錯的 mssql_db 就會出現在這一欄。
  • STATUS:顯示 Up 代表正在跑,Exited 代表已停止。
  • PORTS:顯示容器對外的連接埠。

刪掉後, 需要重新下載 image?

不需要重新下載 image。

刪除容器(Container)只是把那個正在跑的執行個體移除,原本下載好的映像檔(Image)會保留在你的電腦裡。

為什麼不需要重載

映像檔就像是軟體的安裝光碟,而容器是由光碟執行起來的一個程式。你把執行中的程式關掉並刪除,光碟檔案還是會在你的硬碟裡。

當你下一次執行 docker compose up 時,Docker 會檢查本地端是否已經有 mcr.microsoft.com/azure-sql-edge,如果有,它就會直接秒速啟動,不需要再從網路上下載好幾百 MB 的資料。


如何安全刪除並重啟

你可以按照以下步驟操作:

  1. 移除那個狀態為 Exited 的舊容器:

Bash

docker rm mssql_db
  1. 重新啟動你的專案:

Bash

docker compose up -d

加上 -d 參數可以讓它在背景執行,這樣你就不會因為關掉視窗而導致容器停止。

需要我幫你確認你的資料卷(Volumes)是否會保留原本資料庫裡的資料嗎?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *