教程

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

容器不跑 SSH 服务——标准姿势是 SSH 进宿主机,再 docker exec -it <容器> bash(或 sh)。常见报错、Compose 写法、容器里跑 sshd 的合理例外,以及在手机上怎么做。

CC Chen Chen· 创始人·2026 年 6 月 11 日·阅读 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