如何进入一个Docker容器已经运行与一个新的TTY

我有一个在前台运行Apache服务的容器。我希望能够从另一个shell访问该容器,以便在其中“戳”并检查文件。目前,如果附加到容器,就只能看到Apache守护进程,不能运行任何命令。

是否可以将另一个tty附加到正在运行的容器?可能,我可以利用Docker实际上只是围绕LXC容器的事实?我尝试了sudo lxc-console -n [container-id] -t [1-4],但似乎只有一个tty可用,那就是运行apache守护进程的tty。也许有一种方法可以在构建过程中启用多个lxc控制台?

如果可能的话,我宁愿使用配置和构建使用openssh服务的容器。

518779 次浏览

更新

从docker 0.9开始,为了使下面的步骤生效,在重新启动守护进程之前,必须将/etc/default/docker文件和'-e lxc'更新到docker守护进程启动选项(我是通过重新启动主机来完成的)。

update to the /etc/default/docker file

这都是因为……

< p >…它[docker 0.9]包含了一个新的“引擎驱动程序”抽象,使使用成为可能 使用LXC以外的API来启动容器。它也提供了一个新的 基于一个新的API库(libcontainer)的引擎驱动程序 在不使用LXC工具的情况下处理Control group。主要问题是 如果您依赖lxc-attach对您的 容器,比如在容器中开始一个壳,也就是

source

请注意,这将阻止新的docker 0.11的可选特性“工作”,您将只看到环回接口。# EYZ1


事实证明,另一个问题的解决方案也是这个的解决方案:

< p >…你可以使用docker ps -notrunc来获取完整的lxc容器ID和 然后使用lxc-attach -n <container_id>在容器中运行bash作为 根。< / p >

你很快就需要使用ps --no-trunc而不是已弃用的ps -notrunc

enter image description here 找到完整的容器ID

enter image description here

.输入lxc attach命令

enter image description here 顶部显示了我的apache进程正在运行docker启动

“nsinit”的方式是:

安装nsinit

git clone git@github.com:dotcloud/docker.git
cd docker
make shell

从容器内部:

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit

外:

docker cp id_docker_container:/go/bin/nsinit /root/

使用它

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash

您应该使用Jérôme Petazzoni的名为“nsenter”的工具在不使用SSH的情况下进入容器。看到:# EYZ0

安装时只需运行:docker run -v /usr/local/bin:/target jpetazzo/nsenter

然后使用命令docker-enter <container-id>进入容器。

在容器中运行tmux/GNU Screen怎么样? 似乎更流畅的方式访问尽可能多的vty,你想用一个简单的:

$ docker attach {container id}

nsenter做到了这一点。然而,我还需要以一种简单的方式输入一个容器,nsenter不能满足我的需求。在某些情况下有bug(黑屏+ -wd标志不工作)。此外,我想以特定用户的身份登录到特定目录中。

我最终制作了自己的工具来进入容器。你可以在https://github.com/Pithikos/docker-enter找到它

它的使用非常简单

./docker-enter [-u <user>] [-d <directory>] <container ID>

在docker 1.3中,有一个新命令docker exec。这允许你输入一个正在运行的容器:

docker exec -it [container-id] bash

注意:假设bash安装在你的容器上。您可以运行sh或容器上安装的任何交互式shell。

我在运行的microsoft/iis运行守护进程上启动powershell 使用< / p >

docker exec -it <nameOfContainer> powershell
docker exec -t -i container_name /bin/bash

会把你带到集装箱控制台。

获取容器id:

# EYZ0

这将向你展示

容器id镜像命令创建状态端口名称

./run_notebook.sh" 26 seconds ago Up 25 seconds 0.0.0.0:8989->9999/tcp SLURM_TASK-303337_0 .0 /python:env-7e847468c4d73a0f35e9c5164046ad88

在本例中,1170fe9e9460是容器id。

第二个,进入docker:

# EYZ0

所以在上述情况下: # EYZ0 < / p >

docker exec -ti 'CONTAINER_NAME' sh


or


docker exec -ti 'CONTAINER_ID' sh


Windows 10上,我安装了docker。我在容器上运行Jnekins时遇到了相同的错误消息。下面是一步一步解决这个问题的指南:

打开gitbash并运行docker run -p 8080:8080 -p 5000:50000 jenkins。

打开一个新终端。

执行“docker ps”命令获取正在运行的容器列表。复制容器id。

步骤4:现在如果你执行"docker exec -it{容器id} sh"或"docker exec -it{容器id} bash",你会得到一个类似于"输入设备不是TTY "的错误消息。如果你使用的是mintty,试着在命令前加上winpty。”

执行命令“$winpty docker exec -它{容器id} sh

掌! !您现在在候机楼内。