正确的方式从容器中分离而不停止

在Docker 1.1.2(最新版本)中,什么正确的方法从容器中分离而不停止呢?

例如,如果我尝试:

  • docker run -i -t foo /bin/bash或者
  • docker attach foo (为已经运行的容器)

两者都让我到达集装箱docker,我怎样才能不停止集装箱docker?

exitCTR+C都会停止容器。

那么按Ctrl + C (或Ctrl + \ )应该从容器中分离出来,但它会杀死容器,因为你的主进程是一个bash。

关于docker工人的一点教训。 容器不是一个真正的全function操作系统。 运行容器时,启动的进程采用PID 1并假设初始化能力。 所以当这个进程终止的时候,守护进程会停止这个容器,直到启动一个新进程(通过docker start)(关于这个问题的更多解释http://phusion.github.io/baseimage-docker/#intro

如果你想要一个容器,一直在分离模式下运行,我build议你使用

 docker run -d foo 

用容器上的ssh服务器。 (最简单的方法是遵循dockerizing openssh教程https://docs.docker.com/engine/examples/running_ssh_service/

或者你可以通过重新启动你的容器

 docker start foo 

(它将被默认分离)

键入Ctrl + pCtrl + q将帮助您将交互模式转换为守护进程模式。

请参阅https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell

 # To detach the tty without exiting the shell, # use the escape sequence Ctrl-p + Ctrl-q # note: This will continue to exist in a stopped state once exited (see "docker ps -a") 

如果你做“docker附加”容器ID“你进入容器。要退出容器而不停止容器,你需要input”Ctrl + P + Q“

我认为阿什温的答案是最正确的,我的旧答案在下面。


我想在这里添加另一个选项来运行容器,如下所示

 docker run -dti foo bash 

然后你可以进入容器并运行bash

 docker exec -ti ID_of_foo bash 

无需安装sshd 🙂

我深入到这一点,上面的所有答案都是部分正确的。 这完全取决于容器的启动方式。 当容器启动时,下面就是以下内容:

  • 是一个TTY分配( -t
  • 是stdin左开( -i

^P^Q 确实起作用但是:当你启动容器时,你需要指定-t-i

 [berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;' b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518 [berto@g6]$ docker attach test # here I typed ^P^Q read escape sequence # i'm back to my prompt [berto@g6]$ docker kill test; docker rm -v test test test 

ctrl+c 工作但是:你需要指定 -t当你启动容器:

 [berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;' 018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d [berto@g6]$ docker attach test ^C [berto@g6]$ 

第三种方式分离

有一种方法可以拆卸而不杀死容器; 你需要另外一个shell。 总之,在另外一个shell中运行这个,并且运行pkill -9 -f 'docker.*attach'的容器pkill -9 -f 'docker.*attach'

 [berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;' b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518 [berto@g6]$ docker attach test # here I typed ^P^Q and doesn't work ^P # ctrl+c doesn't work either ^C # can't background either ^Z # go to another shell and run the `pkill` command above # i'm back to my prompt [berto@g6]$ 

为什么? 因为你正在杀死把你连接到容器的过程,而不是容器本身。

从交互式容器中分离的默认方式是Ctrl + P Ctrl + Q,但是可以在运行新容器或使用–detach-keys标志附加到现有容器时覆盖它。

如果通过docker attach ,则可以通过停用docker attach过程来分离。 更好的方法是使用sig-proxy参数来避免将Ctrl + C传递给容器:

 docker attach --sig-proxy=false [container-name] 

相同的选项可用于docker run命令。