一句話結論
通常你不是 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。
人人都會撞上的兩個錯誤
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 裡的真實容器名)。
常見問題
怎麼 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 服務時
Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.