如何让 bash 或 ssh 以后台模式进入正在运行的容器?

如何让 bash 或 ssh 以后台模式进入正在运行的容器?

我想通过 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:/#

然而,当我运行上面这行代码时,我得到了新的容器 ID:

$ root@42f1e37bd0e5:/#

我使用过 Vagrant,我想获得类似的行为vagrant ssh

答案1

答案是 Docker 的attach命令。因此,对于我上面的例子,解决方案将是:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

对于 Docker 1.3 或更高版本:感谢用户无线3D谁建议了另一种获取容器 shell 的方法。如果我们使用,attach我们只能使用一个 shell 实例。因此,如果我们想打开一个带有容器 shell 新实例的新终端,我们只需运行以下命令:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

或者

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

答案2

从 Docker 1.3 开始:

docker exec -it <containerIdOrName> bash

基本上,如果使用命令启动了 Docker 容器,/bin/bash则可以使用 访问它attach。如果没有,则需要使用 执行命令以在容器内创建 Bash 实例exec

另外,要退出 Bash,但不让 Bash 在恶意进程中运行:

exit

是的,就这么简单。

答案3

尽管问题的作者明确表示他们对正在运行的容器感兴趣,但也值得注意的是,如果容器没有运行,但您想运行它来探索一下,您可以运行:

docker run -i -t --entrypoint /bin/bash <imageID>

答案4

根据@Timur 的回答,我创建了以下内容方便的脚本

设置

将以下内容放入docker-ssh你的文件中$PATH

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

笔记:有些容器不包含bash,但是ash包含sh等等。这些情况下bash应当在上述脚本中替换。

用法

如果你只有一个正在运行的实例,只需运行

$> docker-ssh 

docker ps否则,为其提供从(第一列)获取的 docker id 参数

$> docker-ssh 50m3r4nd0m1d

相关内容