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

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

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


当前回答

更新

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

这都是因为……

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

请注意,这将阻止docker 0.11的新主机唯一网络可选特性“工作”,您将只看到环回接口。错误报告


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

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

更新:你很快就需要使用ps——no-trunc而不是ps -notrunc,后者已经被弃用了。

找到完整的容器ID

输入lxc attach命令。

顶部显示我的apache进程运行docker启动。

其他回答

docker exec -ti 'CONTAINER_NAME' sh

or

docker exec -ti 'CONTAINER_ID' sh

您应该使用Jérôme Petazzoni的名为“nsenter”的工具在不使用SSH的情况下进入容器。参见:https://github.com/jpetazzo/nsenter

docker run -v /usr/local/bin:/target jpetazzo/nsenter

然后使用命令docker-enter <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

更新

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

这都是因为……

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

请注意,这将阻止docker 0.11的新主机唯一网络可选特性“工作”,您将只看到环回接口。错误报告


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

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

更新:你很快就需要使用ps——no-trunc而不是ps -notrunc,后者已经被弃用了。

找到完整的容器ID

输入lxc attach命令。

顶部显示我的apache进程运行docker启动。

第一步获取容器id:

码头工人ps

这将向你展示

容器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:

Docker exec -it [container_id] bash

所以在上面的例子中: Docker exec - 1170fe9e9460 bash