我想通过 ssh 或 bash 进入正在运行的 docker 容器。请看例子:
$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
665b4a1e17b6 webserver:latest /bin/bash ... ... 22/tcp, 80/tcp loving_heisenberg
现在我想得到这样的东西(进入正在运行的容器):
$ sudo docker run -t -i webserver
(或者也许665b4a1e17b6
相反)
$ root@665b4a1e17b6:/#
但是,当我运行上面的行时,我得到了新的 CONTAINER ID:
$ root@42f1e37bd0e5:/#
我使用了 Vagrant,我希望获得与vagrant ssh
.
答案是Docker的
attach
命令。所以对于我上面的例子,解决方案是:对于 Docker 1.3 或更高版本:感谢用户WiR3D提出了另一种获取容器 shell 的方法。如果我们使用
attach
,我们只能使用 shell 的一个实例。因此,如果我们想用容器 shell 的新实例打开一个新终端,我们只需要运行以下命令:或者
从 Docker 1.3 开始:
基本上,如果 Docker 容器是使用
/bin/bash
命令启动的,您可以使用attach
. 如果没有,那么您需要执行命令在容器内创建一个 Bash 实例,使用exec
.还要退出 Bash 而不让 Bash 在流氓进程中运行:
是的,就这么简单。
虽然问题的作者明确表示他们对正在运行的容器感兴趣,但同样值得注意的是,如果容器没有运行,但你想运行它来四处看看,你可以运行:
docker run -i -t --entrypoint /bin/bash <imageID>
尝试这个:
来源:https ://docs.docker.com/engine/reference/commandline/run/
基于@Timur 的回答,我创建了以下方便的脚本
设置
将
docker-ssh
文件放入您$PATH
的以下内容注意:有些容器不包含
bash
, butash
等sh
。在这些情况下bash
应在上述脚本中替换。用法
如果您只有一个正在运行的实例,只需运行
否则,为它提供您从
docker ps
(第一个列)获得的 docker id 参数如果你的容器没有安装 bash,你可以试试 sh:
或者先在 /bin 中寻找 shell:
我已经创建了一个容器化的 SSH 服务器,它为任何正在运行的容器提供 SSH 功能。你不需要改变你的容器。唯一的要求是容器有 bash。
如果您有一个名为“web-server1”的容器。以下 docker run 命令将启动第二个容器,该容器将为第一个容器提供 SSH。
有关更多指示,请查看https://github.com/jeroenpeeters/docker-ssh
@jpetazzo 有一篇关于这个主题的很棒的帖子。简短的回答是使用
nsenter
:PS:不要忘记查看帖子评论中的讨论...
干杯
您还可以使用 Pipework 为 Docker 容器提供一个可路由的 IP 地址,然后使用该新 IP 地址通过 SSH 连接到机器。
这将更“传统”(ssh),而不是使用特定于应用程序的命令,如
docker attach
,并最终使其在系统和版本之间更“可移植”。有时能够通过 ssh 进入 Docker 容器会很方便,尤其是在开发过程中。以下 Docker 镜像允许使用私钥通过 ssh 进入容器:
UbuntuWithSSH-Docker
Dockerfile 的要点是https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07。