Debian 13、12 安裝 Docker:apt 教學
依照 Docker apt 軟體庫在 Debian 13 或 12 安裝 Docker Engine,並用 apt policy 分辨 docker.io 與 docker-ce,同時避開防火牆繞過與 root 權限風險。
如何在 Debian 13 或 12 安裝 Docker
若要在 Debian 上安裝 Docker,請新增 Docker 自有的 apt 軟體庫,然後從該軟體庫安裝 docker-ce 套件。截至 5 November 2026,Docker 安裝頁面列出兩個 Debian 版本:Debian 13 (trixie) 與 Debian 12 (bookworm)。Debian 11 (bullseye) 不在清單中。
安裝約需執行十個指令。安裝後有兩件更重要的事項:已發布的容器連接埠會繞過防火牆,而 docker 群組的權限等同於 root。本指南涵蓋這兩項內容。
版本每週都可能變更,因此本指南不會列出你將取得的輸出內容,而是說明你應在自己的輸出中尋找哪些資訊。
Docker 支援哪些 Debian 版本?
請先確認版本與 CPU 架構,因為套件庫設定取決於這兩項。
. /etc/os-release && echo "$PRETTY_NAME ($VERSION_CODENAME)"
dpkg --print-architecture第一行應顯示 trixie 或 bookworm。第二行應為 Docker 列出的 Debian 架構之一:amd64、armhf、arm64 或 ppc64el。如果你仍在決定要租用哪種 CPU 類型,請參閱 ARM 與 x86 VPS 方案的差異。
Debian 13 是目前的穩定版本。Debian 12 是舊穩定版本,Debian wiki 列出的 LTS(長期支援)期間為 2026-06-11 至 2028-06-30。如果你要建立新伺服器,請選擇 Debian 13。如果你仍在比較不同系統,為 VPS 選擇 Linux 作業系統會說明這項決策。
Debian 11 需要先升級。Docker 的安裝頁面未列出此版本,而 Debian wiki 顯示其 LTS 期間已於 2026-08-31 結束。你可能會注意到 download.docker.com 仍有 bullseye 目錄。它也有 wheezy 與 jessie 的目錄。該伺服器上的目錄不代表 Docker 支援該版本;支援清單以安裝頁面列出的內容為準。請依照 Debian 11 終止支援升級路徑完成升級,再返回此處。
在 Debian testing 或 Kali Linux 等衍生版本上,以下步驟中的代號不會相符。Docker 的頁面說明,應將其替換為相符 Debian 版本的代號,例如 trixie。
Minimal Debian 是否已安裝 sudo 和 curl?
部分 minimal Debian 映像檔未包含 sudo。開始前先確認。
command -v sudo curl此命令會針對找到的每個工具各輸出一個路徑。缺少某一行表示缺少對應工具。下方的套件庫步驟會安裝 curl,因此這裡只需處理 sudo。如果缺少該工具,請以 root 身分登入並加以安裝。將 YOUR_USER 替換成一般登入名稱。
apt update
apt install -y sudo
usermod -aG sudo YOUR_USER以該使用者登出後重新登入,因為群組成員資格會在登入時讀取。接著執行 sudo whoami。該命令應輸出 root。現在也適合強化 VPS 上的 SSH 安全性,因為接下來將在其上執行更多服務。
docker.io 與 docker-ce:兩者有何差異?
這是兩個不同團隊提供的不同組建。Debian 的套件名稱是 docker.io。Debian Go Packaging Team 維護此套件,並以 Debian 自有的原始碼建置;此套件相依於 Debian 自有的 containerd 與 runc 套件。Docker 的套件名稱是 docker-ce,來源是 Docker 的套件庫,並搭配 Docker 自有的 containerd.io。
兩者最明顯的差異是版本新舊。截至 2026 年 11 月 5 日,Debian 在 trixie 提供的 docker.io 版本為 26.1.5,在 bookworm 提供的版本為 20.10.24;Docker 最新的 Engine 版本則為 29.9.3。這些版本號會變動,因此不要依賴這些數值。下方的 apt policy 小節說明如何在自己的伺服器上查看目前版本。
兩者的套件拆分方式也不同。在 trixie 中,docker.io 將 docker-cli 列為建議安裝的套件,而 Compose 是名為 docker-compose 的獨立套件。Docker 的套件庫則提供 docker-ce、docker-ce-cli、containerd.io,以及供 Buildx 和 Compose 使用的兩個 plugin。
請選擇一個來源並持續使用。本指南採用 Docker 的套件庫,因為 Docker 的文件說明的是這些套件。如果你希望所有套件都來自 Debian archive,且 Debian 套件的版本符合需求,也可以選擇 Debian 的套件。
移除與 docker-ce 衝突的套件
Docker 的文件指出,安裝前應先移除衝突的套件。以下指令涵蓋 Debian 的 Docker 套件、Podman shim,以及獨立的 containerd 和 runc。
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc docker-buildx podman-docker containerd runc | cut -f1)dpkg --get-selections 部分只會列出已安裝的套件,因此 apt 只會移除這些套件,不會移除其他內容。全新的伺服器可能沒有任何套件需要移除。
此步驟不會刪除資料。/var/lib/docker 中的映像、容器、volume 和自訂設定仍會保留在磁碟上。確認前請閱讀 apt 顯示的清單,因為在非全新的伺服器上,其他軟體可能會使用 containerd 和 runc。
以 deb822 格式加入 Docker 的 apt 儲存庫
這些指令會安裝兩個輔助套件、下載 Docker 的 GPG (GNU Privacy Guard) 簽署金鑰,並寫入一個儲存庫檔案。該檔案使用 deb822 格式,也就是 apt 從 .sources 檔案讀取的多行格式。
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt updateShell 會替您填入 Suites 和 Architectures,因此在 Debian 13 或 12 上不必手動編輯任何內容。tee 指令會顯示完成後的檔案。請檢查內容:Suites 應顯示您的代號。Signed-By 行表示 apt 僅接受由此金鑰簽署的套件。
最後一個 sudo apt update 應能從 download.docker.com 取得套件,且不會出現錯誤。如果此伺服器先前安裝過 Docker,可能仍有舊的儲存庫檔案。請找出這類檔案:
grep -rl download.docker.com /etc/apt/唯一的比對結果應為 docker.sources。如果出現第二個比對結果,例如舊的 docker.list,表示有兩個檔案宣告相同的儲存庫。如果 apt 回報來源重複或 Signed-By 問題,請依照 修正重複的 apt 來源與 deb822 檔案 中的步驟操作。
比較 docker.io 與 docker-ce 的 apt policy
您的伺服器現在已識別這兩個套件。此時可根據目前資料確認 docker.io 的問題。
apt policy docker.io docker-ce
apt show docker.io
apt show docker-ce在 apt policy 輸出中,請針對每個套件查看兩項內容。Candidate 行是 apt 今天會安裝的版本。其下方的版本表會顯示哪個伺服器提供該版本。docker-ce 應來自 download.docker.com,而 docker.io 應來自您的 Debian mirror。
在 apt show 輸出中,比較 Maintainer、Depends 與 Recommends 欄位。這些欄位會說明您查看時各套件會拉入哪些相依套件。
如果 docker-ce 沒有候選版本,表示 apt 沒有讀取新的 repository。請檢查上一節的 tee 輸出,然後再次執行 sudo apt update 並查看錯誤訊息。
安裝 Docker Engine 與 Compose plugin
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin這會安裝 repository 中的最新版本。若要選擇特定版本,請先列出可用版本,從清單複製完整字串,並將該字串用於兩個 Engine 套件。
apt list --all-versions docker-ce
VERSION_STRING=paste-the-version-string-here
sudo apt install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin如何確認 Docker 安裝成功?
請依序執行 3 項檢查。每一項都能驗證前一項無法確認的內容。
首先,檢查服務。
sudo systemctl status docker服務狀態應為 active。若不是,請使用 sudo systemctl start docker 啟動服務,再使用 sudo journalctl -u docker -n 50 查看日誌。Docker 文件指出,Debian 預設會在開機時啟動 Docker。您可以在伺服器上使用 systemctl is-enabled docker containerd 進行確認。若任一服務未啟用,請執行 sudo systemctl enable docker.service containerd.service。
其次,執行實際的容器。
sudo docker run hello-world這會從 Docker Hub 下載小型測試映像,並在容器中執行。容器顯示確認訊息,表示 client 與 daemon 都能正常運作,且伺服器可以連線至 Docker Hub。
最後,檢查 client、server 與 Compose plugin。
sudo docker version
docker compose versiondocker version 應顯示 Client 區段與 Server 區段。缺少 Server 區段表示 client 無法連線至 daemon。docker compose version 應輸出版本列。Compose 使用自己的版本號,因此不必與 Engine 版本相同。
如果 hello-world pull 因 You have reached your pull rate limit 而失敗,原因在 Docker Hub,而不是您的安裝。Docker Hub 對每個未驗證的 IPv4 位址或 IPv6 /64 子網路,會在 6 小時內允許 100 次 pull;已驗證的 Personal 帳戶則允許 200 次。在共用位址上,其他使用者可能已用完此限制。請執行 sudo docker login,或等待限制時段結束。
為什麼不應在伺服器上使用 get.docker.com 指令碼?
Docker 官方頁面指出,正式環境不建議使用此便利指令碼。該頁面也說明,此指令碼不是用於升級現有安裝;如果再次執行,可能會與既有的套件儲存庫發生問題。上方的手動步驟只需多花幾分鐘,但會留下可供檢視的套件儲存庫檔案,並讓 apt 管理已安裝的套件。
Debian 上的 Docker 如何升級?
Docker 的套件會像其他套件一樣透過 apt 升級。Docker 的指示是重複執行安裝步驟,然後選擇新版本。
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker ps如果伺服器上有正在執行的容器,請事先規劃升級。Docker 文件指出,根據預設,daemon 終止時會關閉正在執行的容器。因此,請在升級前後比較 sudo docker ps,並為任何必須自動恢復的容器設定 restart policy。若使用 Compose stack,請參閱 如何在開機時自動啟動 Compose 服務。
Docker 的 live restore 選項可在 daemon 停止時讓容器繼續執行。請在 /etc/docker/daemon.json 中設定此選項。此命令會覆寫該檔案,因此如果檔案已存在,請手動加入這個 key。
sudo tee /etc/docker/daemon.json <<'EOF'
{
"live-restore": true
}
EOF
sudo systemctl reload docker
sudo docker info在 docker info 的輸出中尋找 live restore 設定行,以確認設定是否生效。Live restore 有一項實際限制:Docker 僅支援 patch release,major daemon upgrade 不適用。
為什麼發佈的 Docker 連接埠會繞過 ufw 和 firewalld?
發佈任何連接埠前,請先閱讀本節。Docker 的安裝頁面直接說明:如果使用 ufw(uncomplicated firewall)或 firewalld,透過 Docker 暴露的連接埠會繞過防火牆規則。Docker 的防火牆頁面也指出,Docker 與 ufw 不相容,因為封包會在套用防火牆規則前完成路由。
原因在於預設的發佈位址。使用 -p 8080:80 時,daemon 會在主機的所有位址上發佈連接埠,包括 0.0.0.0 和 [::]。Docker 自己的說法是,預設發佈容器連接埠並不安全。拒絕 8080 的 ufw 規則無法阻止這些流量。
一般的解決方式是發佈到 loopback,也就是只有伺服器本身能連線的位址。以下測試使用 Docker 自己的範例。
sudo docker run -d --name web -p 127.0.0.1:8080:80 -p '[::1]:8080:80' nginx
curl -I http://127.0.0.1:8080curl 命令應顯示 nginx 的回應標頭。現在從另一台機器進行測試,將 SERVER_IP 替換為伺服器的公開位址:
curl -I --max-time 5 http://SERVER_IP:8080這項請求應該失敗,表示容器只能從伺服器本身連線。使用 sudo docker rm -f web 移除測試容器。
在 Compose 檔案中,將位址放在 ports 項目內。省略位址時,Compose 會繫結至所有介面。
services:
web:
image: nginx
ports:
- "127.0.0.1:8080:80"有些連接埠必須保持公開,但需要限制來源,例如只允許一個辦公室位址。這類情況請使用 DOCKER-USER chain。Docker 會在套用自身規則前先處理該 chain,這也是 Docker 指定用來篩選已發佈連接埠的位置。相關命令請參閱 Docker 為什麼會繞過 UFW,以及如何修正 的指南。
Docker 的文件中還有兩項規則適用於 Debian。Docker 預設使用 iptables 建立防火牆規則,因此請使用 iptables 或 ip6tables 新增自訂規則。Docker Engine 29 也提供實驗性的 nftables backend,可透過 firewall-backend daemon 選項選用。該 backend 沒有 DOCKER-USER chain:自訂的 nft 規則應放在個別的 tables 中,不應直接修改 Docker 的 tables。此外,也不要在 daemon 設定中設定 "iptables": false。Docker 警告這很可能會導致容器網路運作異常。
不使用 root 執行 Docker:docker 群組與 rootless mode
Docker daemon 以 root 身分執行,並擁有 Unix socket。沒有 sudo 時,您的使用者無法存取該 socket,除非另外授予存取權限。常見作法有兩種。
docker 群組
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world如果群組已存在,groupadd 會回報相關訊息,您可以繼續操作。newgrp 指令只會在目前的 shell 套用新群組。登出後重新登入,才能在所有工作階段套用變更。現在,最後一個指令應可在不使用 sudo 的情況下正常執行。
如果您稍早使用 sudo 執行 Docker,可能會看到以下訊息:
WARNING: Error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied原因是 sudo 讓 ~/.docker 的擁有者或權限設定錯誤。請修正:
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R接著說明代價。Docker 文件指出,docker 群組可授予 root 層級權限。原因是 Docker 可以將主機的 / 目錄掛載到容器中,而該容器接著可以不受限制地修改主機檔案系統。因此,遭竊的 docker 群組帳號等同於遭竊的 root 帳號。只將已經獲得 root 信任的人員加入該群組。在伺服器上,每個指令使用 sudo docker 是合理的選擇。
Rootless mode
Rootless mode 會以一般使用者身分執行 daemon 與容器,因此使用者不會透過 Docker 取得 root 權限。您的使用者至少需要 65,536 個 subordinate user ID 和 group ID。請檢查:
grep ^$(whoami): /etc/subuid
grep ^$(whoami): /etc/subgid每個指令都應輸出一行,且範圍大小應為 65,536。接著安裝輔助工具、停止 system daemon,並以一般使用者身分執行設定工具。最後一個指令不要使用 sudo。
sudo apt install uidmap docker-ce-rootless-extras
sudo systemctl disable --now docker.service docker.socket
sudo rm /var/run/docker.sock
dockerd-rootless-setuptool.sh install該工具會輸出要加入 shell profile 的內容,請將其複製到設定檔。工具也會建立 rootless CLI(命令列介面)context,並將其設為目前使用的 context。執行 docker info:client 區段應顯示 rootless context,而 Security Options 應列出 rootless。
使用 systemctl --user start docker.service 管理 daemon。若要在開機時啟動,請執行 sudo loginctl enable-linger $USER。Docker 的 rootless mode 頁面提供完整參考資料。移轉實際工作負載前,請先閱讀該頁面。
如何從 Debian 解除安裝 Docker?
purge 指令會移除套件,但不會移除映像、容器或 volume,因此接下來的兩行 rm 會將其刪除。這兩行無法復原,請先備份 volume。
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm /etc/apt/sources.list.d/docker.sources
sudo rm /etc/apt/keyrings/docker.asc您手動編輯的任何設定檔(例如 /etc/docker/daemon.json)都會保留,直到您自行刪除為止。如需瞭解 purge 與 remove 在保留及移除內容上的差異,請參閱 apt remove、purge 與 autoremove。
安裝完成後的處理方式
您的伺服器現在已從可供檢查的套件庫執行 Docker。在啟動正式服務前,請先設定資源限制,避免單一容器耗盡所有 RAM:Docker Compose 中的記憶體限制提供相關說明。如果您需要了解適合優先執行的服務,請閱讀2026 年適合自行代管的服務。
FAQ
我可以在 Debian 11 上安裝 Docker 嗎?
截至 2026 年 11 月 5 日,Docker 的安裝頁面只列出 Debian 13 (trixie) 和 Debian 12 (bookworm)。其中未列出 Debian 11,Debian wiki 也顯示其 LTS 期間已於 2026-08-31 結束。Docker 下載伺服器上仍有 bullseye 目錄,但這不代表受到支援。請先將伺服器升級至列出的 Debian 版本,再安裝 Docker。
Debian 上的 docker.io 與 docker-ce 有何差異?
docker.io 是 Debian 的建置版本,由 Debian Go Packaging Team 維護,並相依於 Debian 的 containerd 和 runc。docker-ce 是 Docker 從其自有 apt repository 提供的建置版本。截至 2026 年 11 月 5 日,Debian 版本在 trixie 和 bookworm 中都較舊。執行 apt policy docker.io docker-ce,查看伺服器上的兩個版本及其來源。請安裝其中一個並移除另一個,因為 Docker 的頁面將 docker.io 視為衝突套件。
如何確認 Debian 上的 Docker 已正確安裝?
執行 sudo systemctl status docker,確認服務處於啟用狀態。接著執行 sudo docker run hello-world;此命令會下載測試映像,並顯示來自容器的確認訊息。最後執行 sudo docker version,查看 Client 和 Server 區段,再執行 docker compose version,確認 Compose plugin。
為什麼 Debian 上的 ufw 無法封鎖 Docker 容器的連接埠?
Docker 對已發布連接埠的網路流量會在 ufw 規則套用前完成路由,而未指定位址的已發布連接埠會繫結至主機的所有位址。請將內部服務發布至 loopback,例如 -p 127.0.0.1:8080:80,再從另一台機器測試。若連接埠必須保持公開,請在 DOCKER-USER chain 中使用 iptables 或 ip6tables 進行篩選。
將我的使用者加入 docker 群組安全嗎?
只有在你信任該使用者具備 root 權限時才安全。Docker 文件指出,docker 群組會授予 root 層級權限,因為群組成員可以將主機的 / 目錄掛載至容器,並修改任何檔案。在共用伺服器上,請繼續使用 sudo,或採用 rootless mode,讓 daemon 和容器以一般使用者身分執行。