Docker – input新的TTY运行容器

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

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

如果可能的话,我宁愿configuration和build立一个openssh服务的容器。

随着docker1.3,有一个新的命令docker exec 。 这可以让你input一个正在运行的docker:

 docker exec -it [container-id] bash 

您应该使用JérômePetazzoni的名为“nsenter”的工具,而不使用SSH来input容器。 请参阅: https : //github.com/jpetazzo/nsenter

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

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

更新

从docker 0.9开始,下面的步骤到现在的工作,现在必须在重启守护进程之前用'-e lxc'/etc/default/docker文件更新到docker守护进程启动选项(我通过重启主办)。

更新到/ etc / default / docker文件

这都是因为…

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

资源

请注意,这将阻止docker 0.11的新主机唯一networking可选function从“工作”,您将只能看到回送接口。 错误报告


事实certificate,对另一个问题的解决scheme也是解决这个问题的方法:

…您可以使用ps -notrunc获取完整的lxc容器ID,然后以root身份使用lxc-attach -n <container_id>在该容器中运行bash。

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

在这里输入图像说明 find完整的容器ID

在这里输入图像说明 inputlxc attach命令。

在这里输入图像说明 顶部显示了我的apache进程运行的docker启动。

nsenter这样做。 不过,我也需要以简单的方式input一个容器,而nsenter不足以满足我的需求。 这是在一些场合越野车(黑屏加-wd标志不工作)。 此外,我想以特定用户身份login到特定目录。

我最终使自己的工具进入容器。 你可以在https://github.com/Pithikos/docker-enterfind它;

它的使用非常简单

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

“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 

在容器中运行tmux / GNU屏幕怎么样? 看起来更平滑的方式访问尽可能多的Vty,只要你想要一个简单的:

 $ docker attach {container id} 

我开始使用一个正在运行的微软/ iis运行的守护进程

 docker exec -it <nameOfContainer> powershell