我有一个在前台运行Apache服务的容器。我希望能够从另一个shell访问容器,以便在其中“查找”并检查文件。目前,如果我附加到容器,我只能看着Apache守护进程,无法运行任何命令。
是否可以将另一个tty附加到正在运行的容器上?可能,我可以利用Docker实际上只是环绕LXC容器这一事实?我已经尝试了sudo lxc-console -n [container-id] -t [1-4]
,但似乎只有一个tty可用,那就是运行apache守护进程的tty。也许有一种方法可以在构建期间启用多个lxc控制台?
如果可能,我宁愿不使用openssh服务配置和构建容器。
答案 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守护程序启动选项,然后重新启动守护程序(我这样做了重启主机)。
这都是因为......
...它[docker 0.9]包含一个新的“引擎驱动程序”抽象,以便使用 其他API比LXC启动容器。它还提供了一个新的 基于新API库(libcontainer)的引擎驱动程序 在不使用LXC工具的情况下处理控制组。主要问题是 如果你依靠lxc-attach来执行你的操作 容器,就像在容器内部启动一个shell一样 对发展环境非常有用......
请注意,这会阻止新的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}}。
查找完整的容器ID
输入lxc attach命令。
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 ”
可乐!您现在位于终端机内。