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

Pro*_*ter 501 tty docker

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

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

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

Mic*_*arf 977

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

docker exec -it [container-id] bash
Run Code Online (Sandbox Code Playgroud)

  • 我已将此更改为正确的答案(来自我自己),因为这个新方法在问题发生时并不存在,是目前最好的方法IMO. (28认同)
  • 如果你得到错误'exec:'bash":在$ PATH中找不到可执行文件'你可以试试这个:docker exec -it [container-id]/bin/sh (15认同)
  • 但请注意,`exec`不能作为普通终端.例如,您无法在容器内更改用户一次. (3认同)
  • @Pithikos:我可以使用exec来运行一个shell然后"su someuser"来改变用户.运行Docker 1.4.1 (3认同)
  • 任何读这篇讨论的人都要注意.我确定`docker exec -it`最终将提供一个功能齐全的伪tty,但是现在(Docker版本1.9.1),有一些缺点:https://github.com/docker/docker/issues/ 8755 (2认同)
  • 在Alpine中,如果容器具有定义的名称:`docker exec -it NAME / bin / sh` (2认同)

Hyp*_*cus 40

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

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

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

  • 使用docker 1.3,有一个新命令[`docker exec`](https://docs.docker.com/reference/commandline/cli/#exec).这允许你输入一个正在运行的docker:`docker exec -it <container-id> bash`(参见下面的答案) (4认同)
  • `docker-enter`是否仍然存在?它给了我'命令未找到'. (4认同)

Pro*_*ter 20

更新

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

更新到/ etc/default/docker文件

这都是因为......

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

资源

请注意,这将阻止docker 0.11的新主机唯一网络可选功能 "正常",您将只看到环回接口.错误报告


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

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

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

在此输入图像描述 找到完整的容器ID

在此输入图像描述 输入lxc attach命令.

在此输入图像描述 Top显示我的apache进程正在运行docker启动.


pat*_*_ai 7

第一步骤,这样就集装箱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


cig*_*ig0 5

在容器中运行tmux / GNU Screen怎么办?似乎更简单的方法是通过一个简单的方法来访问任意数量的vty:

$ docker attach {container id}
Run Code Online (Sandbox Code Playgroud)


Fla*_*vio 5

docker exec -ti 'CONTAINER_NAME' sh

or

docker exec -ti 'CONTAINER_ID' sh

Run Code Online (Sandbox Code Playgroud)