docker附加和docker执行之间的区别

两者都能够在容器中执行命令。 两者都可以分离容器。

那么docker exec和docker attach究竟有什么区别呢?

有一个提交公关添加到文档:

注意:该命令( attach )不用于在容器中运行新的进程。 请参阅: docker exec

“ Docker。如何获得bash \ ssh在runned容器( run -d )? ”的答案说明了区别:

(docker> = 1.3)如果我们使用docker attach我们只能使用shell的一个实例
所以如果我们想用容器的shell的新实例打开新的terminal,我们只需要运行docker exec

如果Docker容器是使用/bin/bash命令启动的,则可以使用attach来访问它,如果不是,则需要执行命令以使用exec在容器内创build一个bash实例。

正如在这个问题中提到的:

  • Attach不是用于在容器中运行额外的东西,而是用于附加到正在运行的进程。
  • docker exec ”专门用于在已经启动的容器中运行新的东西,不pipe是shell还是其他进程。

同样的问题补充说:

虽然attach并没有很好的命名,特别是因为LXC命令lxc-attach (这更像是docker exec <container> /bin/sh ,但是特定于LXC),它确实有一个特定的目的,将字面上连接到进程Docker开始。
根据进程的不同行为可能会有所不同 ,例如,连接到/bin/bash会给你一个shell,但是连接到redis服务器就像刚刚直接启动redis而没有守护进程一样。

当使用/ bin / bash启动容器时,它将成为容器PID 1,并使用docker attach来获取容器的PID 1。 所以, docker attach <container-id>会带你进入bashterminal,因为它是PID 1,正如我们在启动容器时提到的那样。 从容器中退出将停止容器。

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

你也可以使用nsenter来进入容器。 nsenter -m -u -n -p -i -t <容器的 PID >可以使用以下命令查找容器的PID:docker inspect <container-id> | grep PID

注意:如果你用-d标志启动你的容器,那么从容器中退出不会停止容器,无论你使用attach还是exec来进入。

Interesting Posts