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守护进程启动选项(我通过重启主办)。
这都是因为…
…它[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