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