如何在后台模式下将bash或ssh获取到正在运行的容器中?

我想ssh或bash到正在运行的docker容器中。 请参阅示例:

$ sudo docker run -d webserverwebserver is clean image from ubuntu:14.04$ sudo docker psCONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES665b4a1e17b6  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.

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

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

对于Docker版本1.3或更高版本:感谢用户 WiR3D 谁提出了另一种方法来获得一个容器的外壳。 如果我们使用 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:/#

码头工人1.3起:

docker exec -it <containerIdOrName> bash

基本上,如果码头货柜是使用 /bin/bash 命令您可以使用 attach. 如果没有,那么你需要执行命令在容器内创建一个Bash实例,使用 exec.

还要退出Bash而不让Bash在流氓进程中运行:

exit

是的,就是这么简单。

虽然问题的作者特别说他们对一个正在运行的容器感兴趣,但同样值得注意的是,如果容器没有运行,但是你想运行它来戳周围你可以运行:

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

试试这个:

sudo docker run -i -t webserver /bin/bash

资料来源: https://docs.docker.com/engine/reference/commandline/run/

基于@Timur的答案,我创建了以下内容 方便的脚本

安装程序

docker-ssh 在你的 $PATH 具有以下内容

#!/bin/bash -xe# docker container id or name might be given as a parameterCONTAINER=$1if [[ "$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 id参数 docker ps (第一个col)

$> docker-ssh 50m3r4nd0m1d

如果您的容器没有安装bash,您可以尝试sh:

docker exec -it CONTAINER /bin/sh

或者先在/bin中寻找贝壳:

docker export CONTAINER|tar -t|egrep ^bin/

我创建了一个容器化SSH服务器,为任何正在运行的容器提供SSH功能。 你不需要改变你的容器。 唯一的要求是容器有bash。

如果你有一个名为'web-server1'的容器。 下面的码头工人运行命令将启动第二个容器,为第一个容器提供SSH。

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \jeroenpeeters/docker-ssh

有关更多指针,请结帐 https://github.com/jeroenpeeters/docker-ssh

@jpetazzo有一个 关于这个主题的精彩帖子. 简短的回答是使用 nsenter:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)nsenter --target $PID --mount --uts --ipc --net --pid

附:不要忘记检查帖子评论中的讨论。..

干杯!

您还可以使用管道为Docker容器提供一个可路由的IP地址,然后使用该新IP地址SSH进入机器。

这将是更"传统"(ssh),而不是使用特定于应用程序的命令,如 docker attach,并最终将使其更"便携"跨系统和版本。

有时能够ssh到Docker容器中会很方便,特别是在开发过程中。 下面的Docker镜像允许使用私钥ssh到容器中:

UbuntuWithSSH-Docker

Dockerfile的要点是 https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.

请注意,使用SSH猛击到正在运行的容器是糟糕的做法-请参阅[这里的理由](https://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/)。`sudo docker exec-i-t container-name/bin/bash’是一条路要走。

或者’sudo docker exec-i-t665b4a1e17b6/bin/sh’以便能够安装apt程序和软件包