正确的方式从容器中分离而不停止
在Docker 1.1.2(最新版本)中,什么正确的方法从容器中分离而不停止呢?
例如,如果我尝试:
-
docker run -i -t foo /bin/bash
或者 -
docker attach foo
(为已经运行的容器)
两者都让我到达集装箱docker,我怎样才能不停止集装箱docker?
exit
和CTR+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 + p , Ctrl + 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
命令。