当前位置: 首页>>技术问答>>正文


如何在背景模式下将bash或ssh放入正在运行的容器中?

, , , ,

问题描述

我想ssh或bash进入正在运行的码头集装箱。请看例子:

$ 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 (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

我使用了Vagrant,我希望获得与vagrant ssh类似的行为。

最佳解决思路

答案是码头的attach命令。因此,对于上面的示例,解决方案将会:

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

更新:(docker> = 1.3)感谢WiR3D用户提供了另一种获取容器 shell 的方式。如果我们使用attach,我们只能使用一个shell实例。所以如果我们想用容器的shell的新实例打开新的终端,我们只需要运行以下命令:

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

次佳解决思路

从码头1.3起。

docker exec -it <containerIdOrName> bash

基本上如果Docker容器是使用/bin /bash命令启动的,你可以使用attach来访问它,如果没有,那么你需要执行命令来使用exec在容器内创建一个bash实例

也可以退出bash而不会在流氓程序中运行bash

exit

Jip那简单。

注意:您应该尽量不要像sudo那样运行命令,而是将您的用户添加到docker组并正常运行。

第三种解决思路

尽管问题的作者明确表示他们对正在运行的容器感兴趣,但也值得注意的是,如果容器未运行,但您想运行它以便徘徊,则可以运行:

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

第四种思路

尝试这个:

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

来源:https://docs.docker.com/articles/basics/#running-an-interactive-shell

第五种思路

基于@帖木儿的回答,我创建了以下handy script

Setup

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

Usage

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

$> docker-ssh 

否则,请提供您从docker ps(第一列)获得的码头标识参数,

$> docker-ssh 50m3r4nd0m1d

第六种思路

我创建了一个容器化的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

第七种思路

@ jpetazzo有一个awesome post about this subject。简短的答案是使用nsenter

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

P.S .:不要忘记查看帖子评论中的讨论……

干杯

第八种思路

如果你的容器没有安装bash(例如。consul),你可以试试sh:

docker exec -it CONTAINER /bin/sh

或者先在/bin中查找shell:

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

第九种思路

docker run -it openjdk:8

这工作:-)

第十种思路

您还可以使用Pipework为Docker Container指定一个可路由的IP地址,然后使用该新IP将SSH带入机器。

这将是更多的”traditional”(ssh),而不是使用像docker attach这样的application-specific命令,并且最终会在系统和版本中使其更多’portable’。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7.html,未经允许,请勿转载。