我想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类似的行为。

评论

或者sudo docker exec -i -t 665b4a1e17b6 / bin / sh能够安装apt程序和软件包

请注意,使用SSH将bash放入运行中的容器是不好的做法–请参阅此处的基本原理。 sudo docker exec -i -t container-name / bin / bash是一种方法。

#1 楼

答案是Docker的attach命令。因此,对于我上面的示例,解决方案将是:对于Docker 1.3或更高版本:感谢用户WiR3D提出了另一种获取容器外壳的方法。如果使用attach,则只能使用一个shell实例。因此,如果要使用容器外壳的新实例打开新终端,则只需运行以下命令:

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




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


评论


或者,执行sudo docker attachloving_heisenberg

–thiagowfx
2014-09-21 19:59



attach命令对我不起作用,它使docker冻结..任何想法为什么会发生?

– Mo J. Mughrabi
14-10-21在8:32

提醒boot2docker用户:删除sudo :)

– Henno
2014年12月29日13:56

-i -t等于-it

–pasha.zhukov
16年8月12日在7:57



这是一个危险的答案,需要选择并获得高度评价。例如,将docker附加到MongoDB实例将杀死该实例。如本问题中更详细的解释,attach和exec是不同的动物。

– fred271828
17年5月10日在18:27

#2 楼

从Docker 1.3开始:

docker exec -it <containerIdOrName> bash


基本上,如果Docker容器是使用/bin/bash命令启动的,则可以使用attach对其进行访问。如果不是,那么您需要执行命令以使用exec在容器内创建一个Bash实例。

也要退出Bash而不使Bash在流氓进程中运行:

exit


是的,就是这么简单。

评论


仍然没有弄清楚如何使纳米工作。认为可能涉及来自phusion的docker-ssh

–WiR3D
14-10-29在13:46

有没有办法在dockers中默认设置bash?

–孔雀
2015年4月6日下午13:13

@ipeacocks是的,如果dockerfile中的RUN命令为/ bin / bash。但是要看你的意思。如果您要运行该容器并在同一终端上立即使用bash,则应使用-it运行它

–WiR3D
15年4月7日在7:43

使用码头工人组是一个坏习惯。本质上,属于docker组的任何用户都具有root权限,而无需使用sudo。 projectatomic.io/blog/2015/08/…

–森ai
16 Mar 7 '16 at 17:48

从主机安全性的角度来看,我认为使用sudo vs docker组并没有多大区别。不管哪种方式,docker都内置了一个安全漏洞,该漏洞可以从来宾提供主机文件系统中的全部特权-无论您使用docker组还是sudo来启动容器。

– nobar
17年8月11日在21:39

#3 楼

尽管问题的作者明确表示他们对正在运行的容器感兴趣,但是也值得注意的是,如果容器未运行,那么您可以运行它以戳一下即可运行:

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

评论


就像@kraxor的答案一样,这提供了一个不同的容器。

–布莱布莱德
2015年9月17日下午15:39

#4 楼

试试这个:

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


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

评论


这不合适,因为我得到了不同的容器ID(root @ 42f1e37bd0e5:/#而不是root @ 665b4a1e17b6:/#)

–蒂莫尔·法兹拉赫曼诺夫(Timur Fayzrakhmanov)
2014年8月1日下午16:31

#5 楼

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

设置

docker-ssh文件放入具有以下内容的$PATH

#!/bin/bash -xe

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

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,但是ashsh等。在这种情况下,应在上述脚本中替换bash

用法

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

$> docker-ssh 


,否则,为它提供一个从docker ps(第一列)获得的docker id参数

$> docker-ssh 50m3r4nd0m1d


评论


我可以知道为什么我们最后需要-l吗?

– Nam G VU
17年11月24日在6:46

将bash作为登录shell启动,读取环境参数(在命令上方的行中进行了描述)

–马提亚
17年11月24日在11:15

#6 楼

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

docker exec -it CONTAINER /bin/sh


,或者先在/ bin中查找shell:

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


评论


什么是“领事”?您有参考吗?你是说“控制台”吗?

– Peter Mortensen
18年8月5日在13:28

#7 楼

我创建了一个容器化的SSH服务器,该服务器为任何运行中的容器提供SSH功能。您无需更改容器。唯一的要求是该容器具有bash。

如果您有一个名称为'web-server1'的容器。以下docker run命令将启动第二个容器,该容器将为第一个容器提供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

评论


顺便说一句,当使用您的解决方案启动ssh会话时,如何自动加载.bashrc?还在github github.com/jeroenpeeters/docker-ssh/issues/30上发布了一个问题

– Nam G VU
17年7月8日在6:05



#8 楼

@jpetazzo对此主题有很棒的帖子。简短的答案是使用nsenter

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


PS:别忘了查看帖子评论中的讨论...

干杯

评论


那是一个相当老的帖子,不再需要。 @ WiR3D的docker exec解决方案相当方便。

– drevicko
17 Mar 10 '17 at 15:46

#9 楼

您还可以使用Pipework为Docker容器提供可路由的IP地址,然后使用该新IP地址将该SSH SSH到计算机中。

这将是更多“传统”(ssh),而不是使用特定于应用程序的命令,例如docker attach,最终将使其在系统和版本之间更“便携”。

评论


请添加简单的方法。老实说,我真的很需要它,但是我没有时间为此寻找最简单的解决方案。你能在这里发表你的答案吗?那会很好..

–蒂莫尔·法兹拉赫曼诺夫(Timur Fayzrakhmanov)
14-10-29在12:08



有两种方法可以完成此操作,但这并不简单,并且可能会成为大篇幅的文章。您可以自己检查此链接,因为使用管道或该链接,女巫在本质上与管道工作相同,并且更为简单,但是您需要手动进行操作。因此,这取决于要谈话的服务器数量。如果您找不到更具体的信息,请告诉我。但是我也没有时间写完整的教程。

– radriaanse
14-10-29在12:30

您是对的-没有明显且简单的方法可以完成此操作(感谢您提供的链接,我想稍后再进行讨论。

–蒂莫尔·法兹拉赫曼诺夫(Timur Fayzrakhmanov)
14-10-29在12:57

#10 楼

有时,能够SSH到Docker容器会很方便,尤其是在开发过程中。以下Docker映像允许使用私钥将其放入容器中:

UbuntuWithSSH-Docker

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

#11 楼

docker run -it openjdk:8


此方法:-)

#12 楼

GOINSIDE

使用以下命令安装goinside命令行工具:

sudo npm install -g goinside


并进入具有适当终端大小的docker容器,其内容如下:

goinside docker_container_name



有关更多详细信息,请查看此内容。

#13 楼

要将bash放入正在运行的容器中,请输入以下内容:

docker exec -t -i container_name /bin/bash


评论


这是与@AdamKalnas相同的答案

–布鲁尼
16 Sep 6'在17:33

#14 楼

仅供参考。如果您需要登录不是守护程序的简单容器,则需要使用以下命令:

docker start {id}
docker attach {id}


#15 楼

如果容器停止了,例如仅数据容器,那么一个好的解决方案是每次您要附加到数据容器时都运行一个一次性容器。在这种情况下,数据容器本身可能完全是空的,因为临时容器将具有OS工具。

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit