如何输入已经使用新TTY运行的Docker容器

时间:2014-01-05 10:13:42

标签: docker tty

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

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

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

11 个答案:

答案 0 :(得分:900)

使用docker 1.3,有一个新命令docker exec。这允许您输入正在运行的泊坞窗:

docker exec -it [container-id] bash

答案 1 :(得分:40)

您应该使用名为'nsenter'的JérômePetazzoni工具在不使用SSH的情况下输入容器。请参阅:https://github.com/jpetazzo/nsenter

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

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

答案 2 :(得分:19)

<强>更新

从docker 0.9开始,对于下面的步骤,现在可以使用/etc/default/docker文件更新'-e lxc'文件到docker守护程序启动选项,然后重新启动守护程序(我这样做了重启主机)。

update to the /etc/default/docker file

这都是因为......

  

...它[docker 0.9]包含一个新的“引擎驱动程序”抽象,以便使用   其他API比LXC启动容器。它还提供了一个新的   基于新API库(libcontainer)的引擎驱动程序   在不使用LXC工具的情况下处理控制组。主要问题是   如果你依靠lxc-attach来执行你的操作   容器,就像在容器内部启动一个shell一样   对发展环境非常有用......

source

请注意,这会阻止新的host only networking optional feature of docker 0.11“正常工作”,您只会看到环回界面。 bug report


事实证明a different question的解决方案也是解决这个问题的方法:

  

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

更新:您很快就需要使用ps --no-trunc代替ps -notrunc,而不是{{1}}。

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

enter image description here 输入lxc attach命令。

enter image description here Top显示了运行docker的apache进程。

答案 3 :(得分:5)

首先步骤获取容器ID:

docker ps

这将显示类似

的内容
  

集装箱ID图像命令创建状态端口名称

     

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

在这种情况下,

1170fe9e9460是容器ID。

第二次,输入泊坞窗:

docker exec -it [container_id] bash

所以在上述情况中: docker exec -it 1170fe9e9460 bash

答案 4 :(得分:4)

如何在容器中运行tmux / GNU Screen? 似乎可以通过简单的方式访问尽可能多的vty:

$ docker attach {container id}

答案 5 :(得分:4)

nsenter就是这么做的。但是我还需要以简单的方式输入容器,而nsenter不足以满足我的需求。在某些情况下它是错误的(黑屏加-wd标志不起作用)。此外,我想以特定用户和特定目录登录。

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

找到它

它的用法和

一样简单
./docker-enter [-u <user>] [-d <directory>] <container ID>

答案 6 :(得分:2)

&#34; nsinit&#34;方式是:

安装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

答案 7 :(得分:2)

docker exec -t -i container_name /bin/bash

将带你到容器控制台。

答案 8 :(得分:1)

我在运行的microsoft / iis上运行了powershell作为守护进程 使用

docker exec -it <nameOfContainer> powershell

答案 9 :(得分:0)

docker stop containster_name

docker start -i container_name

这在登录Ubuntu的终端远程环境中对我有用

答案 10 :(得分:0)

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

步骤1:打开gitbash并运行docker run -p 8080:8080 -p 50000:50000 jenkins。

步骤2:打开一个新终端。

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

步骤4:现在,如果您执行“ docker exec -it {container id} sh”或“ docker exec -it {container id} bash”,则会收到类似于“ the输入设备不是TTY。如果您使用的是薄荷糖,请尝试在命令前添加'winpty'“

步骤5:运行命令“ $ winpty docker exec -it {容器ID} sh

可乐!您现在位于终端机内。