如何进入已运行新TTY的Docker容器

如何进入已运行新TTY的Docker容器,docker,tty,Docker,Tty,我有一个在前台运行Apache服务的容器。我希望能够从另一个shell访问容器,以便在其中“戳”并检查文件。目前,如果我连接到容器,我只能查看Apache守护进程,无法运行任何命令 是否可以将另一个tty连接到正在运行的容器?也许,我可以利用Docker实际上只是在包装LXC容器这一事实?我尝试了sudolxc控制台-n[container id]-t[1-4],但似乎只有一个tty可用,这就是运行apache守护进程的tty。也许有一种方法可以在构建期间启用多个lxc控制台 如果可能的话,我宁

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

是否可以将另一个tty连接到正在运行的容器?也许,我可以利用Docker实际上只是在包装LXC容器这一事实?我尝试了
sudolxc控制台-n[container id]-t[1-4]
,但似乎只有一个tty可用,这就是运行apache守护进程的tty。也许有一种方法可以在构建期间启用多个lxc控制台


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

更新

从docker 0.9开始,要使下面的步骤现在起作用,现在必须在重新启动守护进程之前,使用
'-e lxc'
/etc/default/docker
文件更新到docker守护进程启动选项(我通过重新启动主机完成了这一操作)

这都是因为

…它[docker 0.9]包含一个新的“引擎驱动程序”抽象,使使用成为可能 使用LXC以外的其他API启动容器。它还提供了一种新的方法 基于新API库(libcontainer)的引擎驱动程序 在不使用LXC工具的情况下处理控制组。主要问题是 如果您依赖lxc attach在您的计算机上执行操作 容器,就像在容器中启动一个外壳一样 对开发环境非常有用

请注意,这将阻止新的“工作”,您将只看到环回接口


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

…您可以使用docker
ps-notrunc
获取完整的lxc容器ID和 然后使用
lxc attach-n
在该容器中运行bash作为 根

更新:您将很快需要使用
ps--no-trunc
而不是被弃用的
ps-notrunc

查找完整的容器ID

输入lxc attach命令

上图显示了运行docker启动的apache进程。

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 exec -it [container-id] bash
从外部:

docker cp id_docker_container:/go/bin/nsinit /root/
使用它

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

您应该使用Jérôme Petazzoni的工具“nsenter”来输入容器,而不使用SSH。见:

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


然后使用命令
docker-enter
进入容器。

在容器内运行tmux/GNU屏幕怎么样? 似乎是一种更为顺畅的方式,可以通过以下简单的方式访问任意数量的vty:

$ docker attach {container id}

nsenter
就是这样做的。然而,我也需要以一种简单的方式进入一个容器,Ncenter不能满足我的需要。它在某些情况下是有问题的(黑屏加上wd标志不起作用)。此外,我想作为一个特定的用户登录到一个特定的目录中

我最终制作了自己的工具来进入容器。您可以在以下网址找到:

它的使用非常简单

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

对于docker 1.3,有一个新命令。这允许您输入正在运行的容器:

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit
docker exec -it [container-id] bash

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

我在运行的microsoft/iis运行为守护程序上启动了powershell 使用

docker exec-it powershell

将带您到容器控制台。

首先步骤获取容器id:

docker ps

这将向您展示以下内容

容器ID映像命令已创建状态端口名称

1170fe9e9460 localhost:5000/python:env-7e847468c4d73a0f35e9c5164046ad88“/run_notebook.sh”26秒前上升25秒0.0.0.0:8989->9999/tcp SLURM_任务-303337_0

1170fe9e9460
是本例中的容器id

第二步,输入docker:

docker exec-it[container\u id]bash

因此,在上述情况下:
docker exec-it 1170fe9e9460 bash

docker exec-ti'CONTAINER\u NAME'sh
或
docker exec-ti“容器ID”sh

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

第1步:打开gitbash并运行docker run-p8080:8080-p50000:50000 jenkins

步骤2:打开一个新终端

步骤3:执行“docker ps”以获取正在运行的容器的列表。复制容器id

步骤4:现在,如果执行“docker exec-it{container id}sh”或“docker exec-it{container id}bash”,您将收到类似于“输入设备不是TTY。如果您使用的是mintty,请尝试在命令前面加上'winpty'”的错误消息

步骤5:运行命令“$winpty docker exec-it{container id}sh


沃拉!!您现在在终端内。

所以,只有Docker无法做到这一点,对吗?我个人不喜欢自己混入LXC。有没有办法用LXC attach运行命令来启动bash?谢谢@据我所知,这是正确的。为什么要担心“混合”LXC?你知道docker是建立在LXC之上的吧?@joselo我不理解你的问题,但我建议你创建