【问题标题】:SSH directly into Docker InstanceSSH 直接进入 Docker 实例
【发布时间】:2020-01-19 19:44:33
【问题描述】:

我想通过 SSH 直接进入运行在 Ubuntu VM 上的 docker 映像的 bash。虚拟机有公共 IP。

我想从远程机器上通过 SSH 连接到这个 docker 镜像。我已将远程机器上的身份验证密钥添加到我的 Ubuntu VM 中。然后使用以下命令在 VM 上使用 bash 启动 docker 映像:

docker exec -it CONTAINER_ID bash

当我从远程机器运行 SSH 命令如下:

ssh -i path/to/private/key username_VM@ip_VM

我直接 ssh 进入 Ubuntu 虚拟机,但没有进入 docker 镜像。如何 ssh 直接进入虚拟机上运行的 docker 镜像?

【问题讨论】:

  • 这能回答你的问题吗? How to SSH into Docker?
  • 如果你真的在虚拟机上运行 Docker,也许你需要额外的路由来将主机系统的流量传递到虚拟机。也许你应该在你的问题中澄清这一点。 VM 下的操作系统是什么,您使用的是哪个虚拟化平台?为什么要在里面运行 Docker?
  • 你如何直接 ssh 进入你的浏览器——不是你的主机系统,而是浏览器本身?一个 Docker 镜像通常运行一个进程,而且它几乎从来不是一个 ssh 守护进程(而且几乎不可能正确设置凭据)。我不会担心这种特殊情况。
  • 你是什么意思 - “如何直接 ssh 进入正在运行的 docker”。为什么不 ssh 到远程机器,然后 docker exec -it container-id /bin/bash 到 docker?

标签: docker ubuntu ssh docker-machine


【解决方案1】:

您需要使用-p 向外界公开 Docker 实例的 SSH 端口。如果您运行此映像的主机已将端口 22 用于其 SSH 服务器,则您需要使用不同的端口号。

尝试例如

docker run -p 2222:22 yourimage

然后

ssh -i path/to/private/key -p 2222 username_VM@ip_VM

通过 SSH 登录实例。

【讨论】:

  • 是否有可能代替端口 2222 我只是做 -p 22:22 这样我就不必在 ssh 命令中输入端口号?我尝试运行 docker 命令来转发端口 22,但它退出并出现此 docker 错误:docker:来自守护进程的错误响应:驱动程序在端点 condescending_easley 上编程外部连接失败。启动用户态代理时出错:listen tcp 0.0.0.0:22: bind: address already in use.
  • 这正是我在这个答案中所解释的。您已经有一个使用该端口的 SSH 守护程序,因此您需要使用不同的端口号。或者,关闭托管系统的 SSH 守护程序(但绑定端口 22 需要特权访问;即使没有sudo,也不确定 Docker 是否可以这样做)。
  • 当然,在.ssh/config 中指定端口号可以让您不必在每次连接时都明确指定它,如果这是您想要避免的。