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

分享于 

7分钟阅读

ubuntu

 

问题:

我想让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 (or maybe 665b4a1e17b6 instead)


$ root@665b4a1e17b6:/# 


However when I run the line 上面 I get new CONTAINER 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或者更高版本: 感谢用户 WiR3D,他建议了另一种获取容器 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 访问它。 否则,你需要执行命令,使用 exec 在容器内创建Bash实例。

同时退出 Bash,而不让Bash在流氓进程中运行:

 
exit



 

是啊就是这么简单。


回答 3:

尽管该问题的作者特别感兴趣,但是值得注意,如果容器没有运行,可以运行 poke:

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


回答 4:

尝试这个:


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



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


回答 5:

基于 @Timur's 回答,我创建了下面的脚本。

设置

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,但是在这些情况下,应该在上面的脚本中替换,sh 等等。

用法

如果你有一个运行实例只是运行

 
$> docker-ssh 



 

否则为它提供一个 Docker id parmeter,你可以从 docker ps ( 第一列) 获得它


$> docker-ssh 50m3r4nd0m1d




回答 6:

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

如果你有一个带有 NAME'web-server1'的容器。 以下 Docker 运行命令将启动第二个容器,该容器将为第一个容器提供 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


回答 7:

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


docker exec -it CONTAINER/bin/sh



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


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




回答 8:

@jpetazzo 有一个关于这个主题的帖子。 简短答案是使用 nsenter:


PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)


nsenter --target $PID --mount --uts --ipc --net --pid



不要忘记在文章的评论中查看讨论。

cheers!


回答 9:

还可以给 Docker 容器一个带有管道的routeable地址,然后使用新的IP地址将SSH放入机器。

这将是更多的"繁体中文"( ssh ),而不是使用像 docker attach 这样的应用程序特定命令,最终将在整个系统和版本中。


回答 10:

有时,可以使用ssh进入 Docker 容器,特别是在开发过程中。 下面的Docker 映像允许ssh使用 private 键进入容器:

ubuntuwithssh docker

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



模式  Contain  BASH  后台  SSH  
相关文章