首页 文章

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

提问于
浏览
407

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

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

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

9 回答

  • 1

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

    docker exec -it [container-id] bash
    
  • 2

    如何在容器中运行tmux / GNU Screen?似乎可以通过简单的方式访问尽可能多的vty:

    $ docker attach {container id}
    
  • 3

    您应该使用JérômePetazzoni's tool called ' nsenter'在不使用SSH的情况下输入容器 . 见:https://github.com/jpetazzo/nsenter

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

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

  • 4

    First 步骤获取容器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 .

    Second ,进入泊坞窗:

    docker exec -it [container_id] bash

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

  • 1

    nsenter 那样做 . 但是我还需要以简单的方式输入容器,而nsenter不足以满足我的需求 . 在某些情况下它是错误的(黑屏加-wd标志不起作用) . 此外,我想以特定用户和特定目录登录 .

    我最终制作了自己的工具来输入容器 . 你可以在以下网址找到它:https://github.com/Pithikos/docker-enter

    它的用法很简单

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

    “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
    
  • 40

    Update

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

    update to the /etc/default/docker file

    这都是因为......

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

    source

    请注意,这将阻止来自"working"的新host only networking optional feature of docker 0.11,您将只看到环回接口 . bug report


    事实证明,a different question的解决方案也是这个解决方案:

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

    Update: 您很快就需要使用 ps --no-trunc 而不是 ps -notrunc ,这已被弃用 .

    enter image description here
    查找完整的容器ID

    enter image description here
    输入lxc attach命令 .

    enter image description here
    Top显示我的apache进程正在运行docker启动 .

  • 3
    docker exec -t -i container_name /bin/bash
    

    将您带到容器控制台 .

  • 801

    我在运行的microsoft / iis上运行了powershell作为守护进程使用

    docker exec -it <nameOfContainer> powershell
    

相关问题