一句话结论
通常你不是 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.