2015-06-21 218 views

回答

52

有一个commit PR其加入到该文档:

注:此命令(attach)是不适合的容器中运行的一个新进程。 参见:docker exec

答案为 “Docker. How to get bash\ssh inside runned container (run -d)?” 示出的区别:

(搬运工> = 1.3)如果我们使用docker attach我们可以仅使用一个壳的实例。
因此,如果我们想打开集装箱的外壳的新实例新的终端,我们只需要运行docker exec

如果泊坞窗容器使用/bin/bash命令启动,您可以访问它使用连接,如果没有,那么你需要执行使用exec在容器内部创建bash实例的命令。

正如this issue提到:

  • 附上不是在一个容器中运行一个额外的东西,它是连接到正在运行的进程。
  • docker exec”专门用于在已启动的容器中运行新事物,无论是壳还是其他过程。

同样的问题补充:

虽然attach没有得到很好的命名特别是因为LXC命令lxc-attach的,(这是更接近docker exec <container> /bin/sh,但LXC具体的),它有一个特定的从字面上将您附加到Docker启动的过程。
根据过程的不同,行为可能会有所不同,例如附加到/bin/bash会给你一个shell,但是附加到redis-server会像你刚刚直接启动redis而没有守护进程一样。

7

当容器使用/斌/庆典开始那么变得容器PID 1和搬运工ATTACH用于获取内部容器的PID 1。所以码头附加<容器ID>将带你进入bash终端,因为它是PID 1,正如我们在启动容器时提到的那样。从容器中退出将停止容器。

而在docker exec命令中,您可以指定要输入的shell。它不会把你带到容器的PID 1。它将为bash创建一个新的进程。 docker exec -it < container-id> bash。 从容器中退出不会阻止容器。

您还可以使用nsenter进入容器内部。 nsenter -m -u -n -p -i -t <容器的PID> 您可以使用以下方法找到容器的PID:docker inspect < container-id> | grep的PID

注:如果你有那么-d标志退出了容器不会停止的容器,无论您使用附加或EXEC进去开始你的容器。

相关问题