教學

如何 "SSH 進" Docker 容器(真正的答案是 docker exec)

容器不跑 SSH 服務——標準姿勢是 SSH 進宿主機,再 docker exec -it <容器> bash(或 sh)。常見錯誤、Compose 寫法、容器裡跑 sshd 的合理例外,以及在手機上怎麼做。

CC Chen Chen· 創始人·2026 年 6 月 24 日·閱讀 5 分鐘

一句話結論

通常你不是 SSH Docker 容器——而是 SSH 進宿主機,再用 docker exec 在容器裡開 shell。容器預設不跑 SSH 服務(一般也不該跑:既撐大映像檔又擴大攻擊面)。標準姿勢,無論筆電還是手機,都是:SSH 到宿主 → docker exec -it <容器> bash。本文講這個流程、容器裡跑 SSH 的合理例外、以及常見錯誤。

標準方式:SSH 之上的 docker exec

# 1. SSH 进 Docker 宿主机
ssh user@host

# 2. 找到容器
docker ps

# 3. 在它里面开一个 shell
docker exec -it mycontainer bash
# 精简镜像可能没有 bash:
docker exec -it mycontainer sh

就這樣——你已經在容器內的 shell 裡了,容器裡沒有任何 SSH 服務。exit 回到宿主。一次性的命令連 shell 都不用開:docker exec mycontainer cat /etc/nginx/nginx.conf

從手機到 Docker 宿主機的 SSH 工作階段
在手機上也是同樣兩步:SSH 到宿主,然後 docker exec -it 進容器。容器裡不需要 SSH 服務。

人人都會撞上的兩個錯誤

  • OCI runtime exec failed: "bash": executable file not found——映像檔裡沒有 bash(Alpine 和 distroless 映像檔)。改用 sh;真正極簡/distroless 的映像檔可能連 shell 都沒有。
  • container ... is not running——exec 只對執行中的容器有效。查 docker ps -a;如果它退出了,先用 docker logs mycontainer 看為什麼。

用 Docker Compose

docker compose exec api sh      # 用服务名,不是容器名
docker compose logs -f api      # 顺手看日志

更多手機友善的 Docker 工作流見從手機管理 Docker

容器裡跑 SSH 什麼時候是合理的

確實存在幾種真實場景:容器本身就是一個 SSH 服務(git 伺服器、sftp 端點、暴露在 2222 連接埠的開發環境容器),或平臺不提供 exec 存取。那就在映像檔裡跑 sshd、發布連接埠(-p 2222:22)——並把它當任何伺服器對待:只用金鑰認證、禁 root 登入。其餘情況,docker exec 更簡單也更安全。

在手機上,少打字

容器名和 exec 參數正是手機上最煩人的輸入。兩件事幫上忙:把 docker ps / docker exec -it … sh 存成片段;以及問助手——"在 postgres 容器裡開個 shell"——TermAI 給出確切命令,貼著你所在的宿主(它看得到你最近的輸出,所以知道你上一次 docker ps 裡的真實容器名)。

TermAI 建議一條 docker exec 命令,帶 Run 按鈕
用自然語言描述,得到帶 Run 按鈕的確切 docker exec——助手看得到你最近的 docker ps 輸出,用的是真實容器名。

常見問題

怎麼 SSH 進一個 Docker 容器?
通常不這麼做——SSH 進 Docker 宿主機,然後 docker exec -it 容器 bash(或 sh)。容器預設不跑 SSH 服務。

為什麼 docker exec 報 "bash: executable file not found"?
映像檔裡不含 bash(Alpine 常見)。用 docker exec -it 容器 sh

能 exec 進一個停止的容器嗎?
不能——exec 需要執行中的容器。用 docker logs 看它為什麼退出,或用帶 shell 入口的 docker run 起個新的來檢查映像檔。

該在我的容器裡裝 sshd 嗎?
一般不該——撐大映像檔、增加攻擊面。例外是容器的職責就是 SSH 服務、或平臺沒有 exec 存取。

快速事實

  • 標準姿勢:SSH 到宿主 → docker exec -it <名字> bash(或 sh)
  • 沒有 bash? Alpine/精簡映像檔:用 sh
  • 沒在跑? exec 需要活著的容器——先 docker logs
  • 容器裡的 sshd:只有當容器的職責就是當 SSH 服務時
Try TermAI

Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.

CC
Chen Chen — Founder of TermAI

Writes about mobile DevOps, terminal UX, and the surprising depth of "boring" infrastructure.

Was this useful? ← Back to blog